Chr*_*ton 3 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
Run Code Online (Sandbox Code Playgroud)
将找到脚本tempdir/tempscript并打印h。
然而,如果我们 echo $PATH,我们会看到~/tempdir它的末尾,所以它没有被扩展。这是我们期望发生的情况,因为我们在赋值周围加了双引号。
然而,我找不到任何关于为什么在评估 时会发生波形符扩展的文档$PATH。(请注意,PATH 变量中仍然包含~。)
这是可移植的行为吗?
* Mac OS X 带有 GNU bash 3.2
不,这不是便携式的。如果操作系统的execl调用不执行此扩展,则非bash 的程序将无法在给定目录中找到可执行文件。
请注意,如果您不引用扩展,这将是安全的:
PATH=$PATH:~/tempdir # this is safe -- expansion happens before assignment
PATH="$PATH:~/tempdir" # this is not -- readers are required to expand
Run Code Online (Sandbox Code Playgroud)
虽然引用所有 shell 扩展通常是最佳实践,但这对于赋值来说并不是必需的,因为赋值会隐式阻止字符串分割和全局扩展行为。