评估$PATH时的波浪形扩展



在我的系统*上

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

将找到脚本CCD_ 1并打印CCD_。

然而,如果我们回声$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扩展行为。

相关内容

  • 没有找到相关文章

最新更新