评估 $PATH 时波浪号扩展
tilde expansion when evaluating $PATH
在我的系统上*
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
不,这不是便携式的。如果您的操作系统的 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 扩展行为。
在我的系统上*
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
不,这不是便携式的。如果您的操作系统的 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 扩展行为。