在我的系统上*
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 变量中仍有 ~
。)
这是可移植的行为吗?
* 带有 GNU bash 3.2 的 Mac OS X
最佳答案
不,这不是可移植的。如果操作系统的 execl
调用不执行此扩展,不是 bash 的程序将无法在给定目录中找到可执行文件。
请注意,如果您不引用扩展,这将是安全的:
PATH=$PATH:~/tempdir # this is safe -- expansion happens before assignment
PATH="$PATH:~/tempdir" # this is not -- readers are required to expand
虽然引用所有 shell 扩展通常是最佳做法,但这对于赋值来说不是必需的,这会隐式地防止字符串拆分和 glob 扩展行为。
关于bash - 评估 $PATH 时波浪号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28373043/