1

在我的系统上*

cd                                                 # move to home
mkdir tempdir
PATH="$PATH:~/tempdir"                             # put tempdir in path
touch tempdir/tempscript
echo -e '#!/bin/bash\necho h' > tempdir/tempscript # write script
chmod u+x tempdir/tempscript                       # make executable
tempscript                                         # execute

将找到脚本tempdir/tempscript并打印h

但是,如果我们 echo $PATH,我们会看到~/tempdir它的末尾,所以它没有被扩展。这是我们期望发生的,因为我们在赋值两边加上了双引号。

但是,我找不到任何文档说明为什么在评估$PATH. (请注意,PATH 变量中仍然包含~。)

这是便携式行为吗?

* 带有 GNU bash 3.2 的 Mac OS X

4

1 回答 1

3

不,这不是便携式的。如果您的操作系统execl调用不执行此扩展,则不是bash 的程序将无法在给定目录中找到可执行文件。

请注意,如果您没有引用扩展,这将是安全的:

PATH=$PATH:~/tempdir   # this is safe -- expansion happens before assignment
PATH="$PATH:~/tempdir" # this is not -- readers are required to expand

虽然引用所有 shell 扩展通常是最佳实践,但这对于赋值不是必需的,这隐含地防止了字符串拆分和全局扩展行为。

于 2015-02-06T19:32:04.837 回答