bash - 评估 $PATH 时波浪号扩展

标签 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 变量中仍有 ~。)

这是可移植的行为吗?

* 带有 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/

相关文章:

bash - 在 Bash 中删除和复制文件?

linux - 包含括号的 awk 协进程的转义序列

c++ - 如何从 istream 的开头可移植地获取以字节为单位的偏移量?

java - 无法通过 ant 命令 JAVA_HOME 定位 tools.jar 并且为 jdk 而不是 jre 设置了 PATH

java - 无法识别“javac”且未找到 rmiregistry

java - 使用 ProcessBuilder 停止从 Java 扫描树莓派中的 BLE 加密狗

python - 表达式 awk,python 中的字符无效

c++ - 一个如何包括TR1?

c++ - 使用 Boost Endian 算术类型是否被视为良好实践?

windows - cmd找不到mvn命令