评估$ PATH时的波浪扩展

时间:2015-02-06 19:11:04

标签: bash portability path-variables tilde-expansion

在我的系统上*

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

但是,如果我们回显$PATH,我们会在其末尾看到~/tempdir,因此展开。这是我们期望发生的事情,因为我们在作业中加上双引号。

我无法找到任何关于为什么在评估$PATH时发生波浪扩展的文档。 (请注意,PATH变量中仍然包含~。)

这是可移植行为吗?

* Mac OS X w / GNU bash 3.2

1 个答案:

答案 0 :(得分: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扩展通常是最佳做法,但这对于赋值来说并不是必需的,它隐含地阻止了字符串拆分和全局扩展行为。