修好它
此命令显示错误消息“错误:提取:路径必须是绝对的”:
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
该错误无济于事-该程序已经太混乱了。
您已经知道错误来自~
,因为可以使用$HOME
。
问题:~
仅在单词开头替换。
例如,这适用于波浪号:
echo -extract ~/Downloads
如果您需要使用选项语法=
,则使用$ HOME代替~
是最干净的解决方案;
echo -extract=$HOME/Downloads
实践
您应该知道的是:
在某些特殊情况下,~
get不在单词开头时进行扩展:作为变量赋值的一部分,紧接在=
。之后。当然,这令人困惑。
另一个重要的特殊情况是与PATH等变量一起使用。在变量赋值中,在first之后~
也进行扩展。:
=
$ 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
波浪号的含义
在shell中,~
代字号不是真正的路径。$HOME
有时,它仅被路径替换。
它是外壳程序提供的速记或缩写之类的东西。
通常,它不能像路径一样使用,shell仅在非常特殊的地方将其“扩展”为路径。
即使它被扩展,它也可以位于主目录以外的其他位置。
- 它仅在扩展一个单词的开头,或在一个变量赋值后
:
或=
- 仅当它不在引号内时才展开
- 仅
$HOME
当单词a之前没有其他字符时才扩展/
命令行中的问题
据此,您命令中的问题是波浪号
-extract=~/Downloads/nvidia_installers
不会扩展,因为它不是列出的情况之一。就这样。
解决方案可能是使波浪号成为单词的第一个未加引号的字符,而在下一个字符前没有其他字符/
-这就是在使用option参数时在option参数前加空格时得到的结果:
-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
,则将其扩展到home目录,alice
而不是说home/alice
。
另外,如果您是bob
,~
则将扩展为/home/bob
,然后~bob
将其扩展为相同的值。
该变体~+
被扩展到当前目录,$PWD
要引用上一个目录(位于上一个目录之前)cd
,可以使用~-
,将其扩展为$OLDPWD
。
如果使用pushd
和popd
而不是cd
,您将已经知道可以像那样访问目录堆栈~-2
。
细节
外壳会处理所有~
扩展到路径的情况。对于其他程序,~
只是普通的文件名字符。
对于确切的定义在外壳内部,这里的相关章节
说明如何更换的只是一个的情况很多特殊情况:“如果这个登录名是空字符串,波浪线将被替换为shell参数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.