Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 计算$PATH时的波浪线展开_Bash_Portability_Path Variables_Tilde Expansion - Fatal编程技术网

Bash 计算$PATH时的波浪线展开

Bash 计算$PATH时的波浪线展开,bash,portability,path-variables,tilde-expansion,Bash,Portability,Path Variables,Tilde Expansion,在我的系统上* cd#移动到主页 mkdir tempdir PATH=“$PATH:~/tempdir”#将tempdir放入路径 触摸tempdir/tempscript echo-e'#/bin/bash\necho h'>tempdir/tempscript#编写脚本 chmod u+x tempdir/tempscript#使可执行 临时脚本#执行 将找到脚本tempdir/tempscript并打印h 但是,如果我们回显$PATH,我们将在它的末尾看到~/tempdir,因此它没有

在我的系统上*

cd#移动到主页
mkdir tempdir
PATH=“$PATH:~/tempdir”#将tempdir放入路径
触摸tempdir/tempscript
echo-e'#/bin/bash\necho h'>tempdir/tempscript#编写脚本
chmod u+x tempdir/tempscript#使可执行
临时脚本#执行
将找到脚本
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扩展通常是一种最佳实践,但这对于赋值是不必要的,因为赋值隐式地防止了字符串拆分和全局扩展行为。

BASH
中,它是可移植的行为。看一看:@user3439894,如果没有被引用,那是真的。引用可防止平铺展开,即使将其赋值给变量也是如此。这在你链接的文档中是明确的:“每个变量赋值都会检查是否有不带引号的tilde前缀”@Charles Duffy,好吧,我想从现在起,我会对我说的每一句话进行限定!是的,当在规则的范围内这样做时,它是可移植的,因此我在我的第一条评论中包括了链接,因为我希望用户也能RT*M@user3439894,…但是OP显式地演示了一个带引号的赋值。一个通情达理的读者可能会认为“this”指的是演示中给出的代码。-@Charles Duffy,好吧,我错过了OP中作业的引语!)关于作业我不知道-谢谢。另外,我刚刚在centos 6系统上试用过,它在那里也能正常工作。所以也许它是未定义的,但基本上是一致的行为。@AmadeusDrZaius看一下: