बस इसे ठीक कर रहा हूं
यह आदेश एक त्रुटि संदेश दिखाता है "त्रुटि: अर्क: पथ निरपेक्ष होना चाहिए":
./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.