【问题标题】:tilde expansion when evaluating $PATH评估 $PATH 时的波浪号扩展
【发布时间】:2015-04-07 00:35:27
【问题描述】:

在我的系统上*

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

【问题讨论】:

  • BASH 它是可移植的行为。看看:Tilde Expansion
  • @user3439894,这是真的如果没有引用。引用可以防止波浪号扩展,即使分配给变量也是如此。这在您链接的文档中明确说明:“每个变量赋值都检查了 unquoted tilde-prefixes”
  • @Charles Duffy,好吧,我想从现在开始,我所说的一切都符合条件!是的,在规则范围内这样做是可移植的,因此我在第一条评论中包含了链接,因为我希望用户也能 RT*M!
  • @user3439894, ...但 OP 明确展示了一个引用的分配。合理的读者可能会期望“this”指的是该演示中给出的代码。-
  • @Charles Duffy,好的,我错过了 OP 作业中的引述! :)

标签: bash portability path-variables tilde-expansion


【解决方案1】:

不,这不是便携式的。如果您的操作系统的execl 调用不执行此扩展,则不是 bash 的程序将无法在给定目录中找到可执行文件。

请注意,如果您没有引用扩展,这将是安全的:

PATH=$PATH:~/tempdir   # this is safe -- expansion happens before assignment
PATH="$PATH:~/tempdir" # this is not -- readers are required to expand

虽然引用所有 shell 扩展通常是一种最佳做法,但这对于赋值不是必需的,因为它隐式地防止了字符串拆分和全局扩展行为。

【讨论】:

猜你喜欢
  • 2011-06-06
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多