5

我发现波浪号扩展不适用于以下情况:

$ set -x

$ ./print_arg.pl destdir=~/test
+ ./print_arg.pl 'destdir=/root/test'
destdir=/root/test

$ ./print_arg.pl dest-dir=~/test
+ ./print_arg.pl 'dest-dir=~/test'
dest-dir=~/test

$ ./print_arg.pl -destdir=~/test
+ ./print_arg.pl '-destdir=~/test'
dest-dir=~/test

print_arg.pl 的内容是

#!/usr/bin/perl
print $ARGV[0],"\n";

根据Shell 处理顺序,Shell 会在“波浪扩展”之前拆分单词。我注意到分词实际上是不同的。结果不同的原因是什么?

4

1 回答 1

4

波浪号扩展也发生在 shell 变量赋值中,destdir=~/test类似于。dest-dir=~/test并且-destdir=~/test不要,因为-它不是变量名中的有效字符。尽管 shell 没有将其评估destdir=~/test为变量赋值(如果set -k使用它,它会),但解析器似乎仍在将其视为变量并在 RHS 上执行波浪号扩展。

来自http://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html#Tilde-Expansion

每个变量赋值都会检查紧跟在 ':' 或第一个 '=' 之后的未加引号的波浪号前缀。在这些情况下,也执行波浪号扩展。因此,可以在分配给 PATH、MAILPATH 和 CDPATH 时使用带有波浪号的文件名,并且 shell 分配扩展值。

请注意,使用-k选项集,正确的变量分配将被处理并从传递给的参数列表中删除print_arg.pl

~ $ set -kx
~ $ ./print_arg.pl destdir=~/bin foo
+ destdir=/Users/clint/bin
+ ./print_arg.pl foo
foo
~ $ ./print_arg.pl dest-dir=~/bin foo
+ ./print_arg.pl 'dest-dir=~/bin' foo
dest-dir=~/bin
于 2013-03-19T16:01:21.180 回答