修正するだけ
このコマンドは、「エラー:抽出:パスは絶対パスでなければなりません」というエラーメッセージを表示します。
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
エラーは役に立たない-プログラムは既に混乱しすぎていた。
エラーはからのもの~
であることが既にわかっています$HOME
。
問題:~
単語の先頭でのみ置き換えられます。
たとえば、これはチルダで機能します。
echo -extract ~/Downloads
でオプション構文が必要な場合は、最もクリーンなソリューションである=
代わりに$ HOMEを使用し~
ます。
echo -extract=$HOME/Downloads
練習
知っておくべきこと:
~
単語の先頭にないときにgetが展開される特殊なケースがあります=
。変数の割り当ての一部として、の直後にあります。もちろん、これは紛らわしいです。
もう1つの重要な特別なケースは、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
リストされているケースの1つではないため、展開されません。それで全部です。
解決策は、チルダを単語の最初の引用されていない文字にし、次の文字の前に他の文字/
を入れないことです。
-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
代わりにand を使用すると、cd
ディレクトリスタックに~-2
。
詳細
~
パスに展開されるすべてのケースは、シェルによって処理されます。他のプログラムの場合~
は、単なる通常のファイル名文字です。
以下のために正確な定義殻の内側、ここでの関連セクションで
置き換える方法注では、多くの例一つだけの特別なケースでは:このログイン名がNULL文字列の場合は」、チルダはシェルパラメータHOMEの値に置き換えられます。 」: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.