2012-07-20 8 views
45

मैंने हमेशा सोचा था कि $HOME और ~ बिल्कुल वही थे और इस प्रकार एक दूसरे के लिए उपयोग किया जा सकता था। आज, जब मैं अपने साझा सर्वर पर pylibmc, एक अजगर memcached के लिए बाध्य, स्थापित करने के लिए करने की कोशिश की ~ के उपयोग मुझे त्रुटि दिया था, लेकिन नहीं $HOME। मैं तर्क देना चाहता हूं क्यों।

libmemcachedpylibmc के लिए एक आवश्यकता है। मेरे पास libmemcached स्थापित है मेरी होम निर्देशिका के तहत क्योंकि मेरे पास सर्वर पर कोई रूट नहीं है। नतीजतन, pylibmc इंस्टॉल करें, मुझे यह सुनिश्चित करना होगा कि इंस्टॉलेशन स्क्रिप्ट जानता है कि libmemcached खोजें।

जब python setup.py install --with-libmemcached=~ को क्रियान्वित करने, स्थापना स्क्रिप्ट

 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \ 
    -Wstrict-prototypes -fPIC -DUSE_ZLIB -I~/include \ 
    -I/usr/local/include/python2.7 -c _pylibmcmodule.c \ 
    -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing 

जो त्रुटियों libmemcached कि नहीं पाया जा सकता है देता है चलाता है।

अगर मैं --with-libmemcached=$HOME को बदलने के लिए, स्क्रिप्ट

 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \ 
    -Wstrict-prototypes -fPIC -DUSE_ZLIB -I/home/waterbotte/include \ 
    -I/usr/local/include/python2.7 -c _pylibmcmodule.c \ 
    -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing 

चलाता है किसी भी समस्या के बिना। ऐसा लगता है कि समस्या यह है कि टिल्डे को हल नहीं किया जाता है। पर क्यों?

+5

मैं टिल्ड को कमांड लाइन सुविधा मानता हूं। स्क्रिप्ट में, '$ HOME' का हमेशा उपयोग किया जाना चाहिए। –

उत्तर

27

खोल उपयोगकर्ता के घर निर्देशिका के साथ ~ बदल देता है (अद्यतन: या शायद कुछ अन्य उपयोगकर्ता के घर निर्देशिका से, अगर ~ एक / के अलावा कुछ द्वारा पीछा किया जाता है), लेकिन केवल अगर यह एक का पहला वर्ण है शब्द।

--with-libmemcached=~ में ~ शुरुआत में नहीं है, इसलिए खोल इसे अकेला छोड़ देता है।

+2

स्ट्रोमबर्ग @ aw50 ~ $ गूंज एबीसी ~ डीईएफ़ एबीसी ~ डीईएफ़ स्ट्रोमबर्ग @ aw50 ~ $ गूंज ~ डीईएफ़ ~ डीईएफ़ स्ट्रोमबर्ग @ aw50 ~ $ डीईएफ़ गूंज ~ डीईएफ़ ~ स्ट्रोमबर्ग @ aw50 ~ $ गूंज एबीसी $ {गृह} डीईएफ़ एबीसी/घर/strombergdef स्ट्रोमबर्ग @ aw50 ~ $ $ {गृह} डीईएफ़ /घर/strombergdef स्ट्रोमबर्ग @ aw50 ~ $ गूंज गूंज डीईएफ़ $ {गृह} डीईएफ़/घर/स्ट्रोमबर्ग स्ट्रोमबर्ग @ aw50 ~ $ – user1277476

+0

@ उपयोगकर्ता 1277476: यह पढ़ने के लिए बहुत मुश्किल है। कृपया अद्यतन देखें। –

+0

सीखने के लिए दिलचस्प तथ्य। वास्तव में मैं क्या देख रहा हूँ। धन्यवाद एनएम – tamakisquare

33

टिल्ड shell expansion (जैसे बैश, सीएसएच, जेएसएच आदि) का हिस्सा है। $HOME चर निर्यात योग्य है और इसे एक विशिष्ट खोल से स्वतंत्र किया जा सकता है।

8

मुख्य अंतर यह है:

cd /tmp 
ls "$HOME" #works 
ls "~" #nope 

तो, खोल ~ केवल कुछ स्थितियों में विस्तार। आपके मामले में, पाइथन स्क्रिप्ट को स्क्रिप्ट के अंदर ~ मिला - एक्सपेड वैल्यू नहीं।

15

~ ही विस्तार किया जाता है अगर यह एक शब्द के पहले अक्षर है और यह गैर उद्धृत है

$ echo "~" 
~ 
$ echo foo~ 
foo~ 
$ echo ~ 
/home/guest 
$ echo ~/foo 
/home/guest/foo 

~usernameusername की HOME करने के लिए विस्तारित किया गया है।

$ echo ~root 
/root 
$ echo ~invaliduser 
~invaliduser 

फ़ाइल नाम के शब्दों में, आप $HOME का उपयोग करें या से "POSIX Tilde Expansion"

पथ नाम टिल्ड विस्तार से उत्पन्न निम्नलिखित प्रत्यय बोली

$ echo "$HOME/foo bar" 
/home/guest/foo bar 
$ echo ~/"foo bar" 
/home/guest/foo bar 
$ echo ~root/"foo bar" 
/root/foo bar 

नोट करना चाहिए के रूप में अगर को उद्धृत माना जाएगा इसे फ़ील्ड स्प्लिटिंग और पथनाम विस्तार द्वारा बदला जा रहा है।

संबंधित मुद्दे