क्या टिल्ड, `~` को एक सापेक्ष पथ माना जाता है?


35

मैं एनवीडिया क्यूडा लाइब्रेरी इंस्टॉलर के अलग हिस्से को निकालने की कोशिश कर रहा हूं। मैं निम्नलिखित कमांड का उपयोग कर रहा हूं:

mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

और मुझे निम्नलिखित संदेश मिलता है:

ERROR: extract: path must be absolute.

और जब मैं अपने घर के शाब्दिक पते के साथ कमांड टाइप करता हूं तो यह पूरी तरह से काम करता है।

./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers

मैं उलझन में नहीं होना चाहिए ~ एक ही / घर / इसी तरह खुला / XXX / उपयोगकर्ता नाम?

परीक्षण:

./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers

और यह काम करता है, लेकिन मुझे नहीं पता कि यह अनुमति क्यों नहीं देता है ~


2
संबंधित: "ए" टिल्ड-प्रीफिक्स "में एक शब्द की शुरुआत में एक अछूता <टिल्डे> चरित्र होता है, इसके बाद सभी पात्रों में से पहले अक्षर पहले होते हैं"
ब्रियम

जवाबों:


47

बैश केवल एक ~ अगर यह एक शब्द की शुरुआत है फैलता है। आप इसे निम्न आदेशों के बीच देख सकते हैं:

$ echo -extract=~/test
-extract=~/test

oli@bert:~$ echo -extract ~/test
-extract /home/oli/test

बैश स्टैंडअलोन ~पात्रों के लिए और ~/इस प्रतिस्थापन के लिए दिखता है । कोई अन्य संयोजन या उद्धृत संस्करण काम नहीं करेगा।

$HOMEकाम करता है क्योंकि चर प्रतिस्थापन अधिक मजबूत होते हैं ( $यह एक विशेष चरित्र है जबकि ~बहुत कम है):

$ echo Thisisastring${HOME}awrawr
Thisisastring/home/oliawrawr

जबकि हम इसके बारे में बात कर रहे हैं ~, इसमें वास्तव में अन्य प्रतिस्थापन के एक और जोड़े का उपयोग किया गया है:

  • ~+वर्तमान काम निर्देशिका (से पढ़ें $PWD)
  • ~-पिछले काम निर्देशिका (से पढ़ें $OLDPWD)

सादे के रूप में ~, ये अंत में अतिरिक्त पथ से निपट सकते हैं, और फिर, ये एक शब्द के लिए उपसर्ग होना चाहिए या बैश उन्हें अनदेखा कर देगा।

आप इसके बारे में अधिक पढ़ सकते हैं man bash | less -p ' Tilde'


2
यह ध्यान देने योग्य है कि लायक है zsh करता है (या बल्कि करने के लिए विन्यस्त किया जा सकता) का विस्तार ~करने के बाद =भी। अन्य सुविधाजनक सुधारों के बीच इस पर बैश है।
Jan Hudec

@ जानहुडेक नहीं - यह अधिक जटिल है; इसके बाद के विस्तार के बारे में नहीं है =; यह दाईं ओर की शुरुआत में विस्तार के बारे में है एक चर असाइनमेंट पीएफ। यह हमारे मामले को थोड़ा और भ्रामक बनाता है जब बारीकी से - मेरा जवाब देखें। और इसमें zshसे अलग नहीं है bash; 'Zsh' का वर्णन थोड़ा गूढ़ है: info --subnodes zsh | less +/'14.7.4 Notes'(zsh मैन पेज गायब हैं)
वोल्कर

1
@VolkerSiegel: zshबहुत विन्यास योग्य है। मेरे शून्य में echo -extract=~/testपरिणाम -extract=/home/user/test। यह MAGIC_EQUAL_SUBSTविकल्पों द्वारा सक्षम है । एक साइड-नोट पर, मेरे पास सभी zsh मैन पेज ठीक हैं।
Jan Hudec

@JanHudec zshविन्यास होने के बारे में कोई संदेह नहीं है - और अन्य सुधार; मुझे उम्मीद है कि MAGIC_EQUAL_SUBST (14.7.4 में कवर) डिफ़ॉल्ट रूप से परेशान है, और शायद ही कभी उपयोग किया जाता है; यदि आपके पास सामान्य रूप से सक्षम है, तो अब यह स्पष्ट रूप से अधिक प्रासंगिक है। अच्छे आकार में अपना उदाहरण खंड प्राप्त करने के बाद, यह एक अच्छा जोड़ बना देगा ...
वोल्कर साइगल

@JHHudec zsh मैन पेजों के बारे में, वे कुछ समय के लिए उबंटू संकुल से गायब थे, संकेत के लिए धन्यवाद, पता नहीं था कि तय हो गया था; बग को देखते हुए, यह यूटोपिक के लिए तय है, लेकिन भरोसेमंद नहीं है - जो इसे समझाता है!। ( लॉन्चपैड: सभी zsh manpages और इनलाइन हेल्प फाइल्स गायब हैं और AU: zsh मैन मिसिंग ... )
वोल्कर साइगल

19

बस इसे ठीक कर रहा हूं

यह आदेश एक त्रुटि संदेश दिखाता है "त्रुटि: अर्क: पथ निरपेक्ष होना चाहिए":

./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

त्रुटि सहायक नहीं है - प्रोग्रामम पहले से ही बहुत उलझन में था।
आप पहले से ही जानते हैं कि त्रुटि किसकी है ~, क्योंकि यह $HOMEइसके साथ काम करती है ।

समस्या: ~केवल एक शब्द की शुरुआत में बदल जाती है।

उदाहरण के लिए, यह टिल्ड के साथ काम करता है:

echo -extract ~/Downloads

यदि आपको विकल्प सिंटैक्स की आवश्यकता है =, तो इसके बजाय $ HOME का उपयोग ~करना सबसे साफ समाधान है;

echo -extract=$HOME/Downloads

अभ्यास

आपको क्या पता होना चाहिए:

ऐसे विशेष मामले हैं जहां ~एक शब्द की शुरुआत में नहीं होने पर विस्तार होता है: एक चर असाइनमेंट के हिस्से के रूप में, सीधे के बाद =। जो यहाँ भ्रमित है, निश्चित रूप से।

PATH जैसे चर के साथ उपयोग करने के लिए अन्य महत्वपूर्ण विशेष मामला। चर असाइनमेंट में, ~बाद में भी विस्तार किया जाता है :, जैसे पहले के बाद =

$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2: 
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2: 
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2: 
$ echo d3: $d3
d3: /home/user

टिल्ड का अर्थ

एक शेल में ~, टिल्ड, वास्तव में एक रास्ता नहीं है। यह केवल $HOMEकुछ समय के लिए एक मार्ग से बदल दिया जाता है ।

यह एक शॉर्टहैंड या संक्षिप्त नाम की तरह कुछ है, जो शेल द्वारा प्रदान किया गया है।
यह सामान्य रूप से एक पथ की तरह उपयोग नहीं किया जा सकता है, शेल इसे केवल विशेष स्थानों में एक पथ पर "विस्तार" करता है।
और यहां तक ​​कि अगर इसका विस्तार किया जाता है, तो यह होम डायरेक्टरी की तुलना में कुछ और हो सकता है।

  • यह केवल पर विस्तार किया जाता है जो शब्द के प्रारंभ , या एक में एक के बाद चर काम :या=
  • यह केवल विस्तारित है अगर यह उद्धरण के अंदर नहीं है
  • इसका विस्तार केवल तभी किया जाता है $HOMEजब शब्द में आगे वर्ण न हों/

कमांड लाइन में समस्या

इसके अनुसार, आपकी कमांड में समस्या यह है कि टिल्ड इन

-extract=~/Downloads/nvidia_installers

का विस्तार नहीं किया गया है, क्योंकि यह सूचीबद्ध मामलों में से एक नहीं है। बस इतना ही।

इसका हल यह हो सकता है कि टिल्डे को एक शब्द का पहला निर्विवाद चरित्र बनाया जाए, जिसके आगे कोई दूसरा चरित्र न हो /- बस यही एक विकल्प है जब आप विकल्प तर्क से पहले एक स्थान के साथ एक विकल्प का उपयोग करते हैं:

-extract ~/Downloads/nvidia_installers

एक और समाधान $HOMEइसके बजाय उपयोग करना होगा । एक स्क्रिप्ट में, यह आमतौर पर बेहतर विकल्प है।

-extract=$HOME/Downloads/nvidia_installers

त्रुटि संदेश

लेकिन त्रुटि संदेश कैसे होता है
"ERROR: extract: path must be absolute."?
इस सब में फिट?

हम जानते हैं कि टिल्ड का विस्तार नहीं हुआ। इसका मतलब है कि कार्यक्रम में तर्क पाठ शामिल है ~, लेकिन /home/auserपथ के बिना । वह रास्ता है ~/Downloads/nvidia_installers- लेकिन अब कोई खोल नहीं है, इसलिए टिल्ड का कोई विशेष अर्थ नहीं है। यह सिर्फ एक सामान्य निर्देशिका का नाम है। और रूप के हर दूसरे मार्ग के रूप में foo/bar/baz, यह एक सापेक्ष पथ है

अन्य उपयोग

यदि इसके बाद के अक्षर हैं ~, जैसे कि ~alice- आवेदन करने के ऊपर के अन्य सभी नियमों के साथ - और एक उपयोगकर्ता नाम है alice, जो aliceइसके बजाय होम निर्देशिका में विस्तारित है home/alice
इसके अलावा, यदि आप हैं bob, ~तो इसका विस्तार होगा /home/bob, और ~bobउसी तक विस्तारित होगा।

संस्करण ~+को वर्तमान निर्देशिका में विस्तारित किया जाता है,$PWD

पिछली निर्देशिका को संदर्भित करने के लिए, जहां आप अंतिम से पहले थे cd, आप उपयोग कर सकते हैं ~-, जिसका विस्तार किया गया है $OLDPWD

यदि आप उपयोग करते हैं pushdऔर popdइसके बजाय cd, आप पहले से ही जानते होंगे कि निर्देशिका स्टैक को एक्सेस किया जा सकता है ~-2

विवरण

वे सभी मामले जहां ~एक पथ का विस्तार किया जाता है, उन्हें शेल द्वारा नियंत्रित किया जाता है । अन्य कार्यक्रमों के लिए, ~सिर्फ एक सामान्य फ़ाइल नाम चरित्र है।

के लिए सटीक परिभाषा खोल के अंदर, यहाँ के प्रासंगिक अनुभाग है नोट कैसे जगह से सिर्फ एक कई मामलों की विशेष मामला है: "इस लॉगिन नाम अशक्त स्ट्रिंग है, तो टिल्ड खोल पैरामीटर घर के मूल्य के साथ बदल दिया है। " :man bash
~$HOME

Tilde Expansion
    If a word begins with an unquoted tilde character (`~'), all of the charac‐
    ters  preceding the first unquoted slash (or all characters, if there is no
    unquoted slash) are considered a tilde-prefix.  If none of  the  characters
    in  the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
    ing the tilde are treated as a possible login name.  If this login name  is
    the  null string, the tilde is replaced with the value of the shell parame‐
    ter HOME.  If HOME is unset, the home directory of the user  executing  the
    shell is substituted instead.  Otherwise, the tilde-prefix is replaced with
    the home directory associated with the specified login name.

    If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
    the  tilde-prefix.   If  the tilde-prefix is a `~-', the value of the shell
    variable OLDPWD, if it is set, is substituted.  If the characters following
    the tilde in the tilde-prefix consist of a number N, optionally prefixed by
    a `+' or a `-', the tilde-prefix is replaced with the corresponding element
    from  the  directory  stack,  as  it would be displayed by the dirs builtin
    invoked with the tilde-prefix as an argument.  If the characters  following
    the  tilde in the tilde-prefix consist of a number without a leading `+' or
    `-', `+' is assumed.

    If the login name is invalid, or the tilde expansion  fails,  the  word  is
    unchanged.

    Each variable assignment is checked for unquoted tilde-prefixes immediately
    following a : or the first =.  In these cases, tilde expansion is also per‐
    formed.   Consequently, one may use filenames with tildes in assignments to
    PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.

3

~प्रति पथ नहीं है। यह एक ऐसा पात्र है जो शेल से विशेष उपचार प्राप्त करता है, जहां ~या ~/इसका अर्थ है "वर्तमान उपयोगकर्ता के घर निर्देशिका पथ के साथ बदलें"। ~usernameका अर्थ है "उपयोगकर्ता नाम के घर निर्देशिका पथ के साथ बदलें"।

क्योंकि यह एक रास्ता नहीं है, यह केवल कमांड में कुछ स्थानों पर मान्यता प्राप्त है (एक नए अंतरिक्ष-विभाजन टोकन के पहले चरित्र के रूप में)।

जब इसका विस्तार किया गया, तो इसे एक निरपेक्ष मार्ग से बदल दिया गया।

$HOMEकार्यों का उपयोग करना क्योंकि होम केवल शेल द्वारा सेट किया गया एक वैरिएबल है और वेरिएबल रिप्लेसमेंट के लिए सामान्य शेल नियमों का पालन करता है (यह रिक्त स्थान पर इनपुट विभाजित होने और निष्पादित होने से पहले होता है)।


1

तुम सही हो। ~ / डाउनलोड / होम / उपयोगकर्ता नाम / डाउनलोड के समान है।

कुछ इंस्टॉलर और एक्सट्रैक्टर बस बहुत अचार के बारे में हैं जहां इसे चीजों को रखने की आवश्यकता है। मुझे लगता है कि यह हो सकता है क्योंकि यह फ़ाइलपथ को लॉग करता है, और लॉग एक स्वीकृत पथ में स्वीकार नहीं करता है।

मुझे सिर्फ इसके बजाय / घर / उपयोगकर्ता नाम टाइप करने की आदत है। :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.