我发现波浪展开不适用于以下情况:
$ 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变量赋值中,与destdir=~/test
类似。dest-dir=~/test
和-destdir=~/test
不能,因为-
不是变量名中的有效字符。尽管shell没有将destdir=~/test
作为变量赋值(如果使用set -k
,它会这样做),但解析器似乎仍然将其视为变量赋值,并在RHS上执行波浪展开。
检查每个变量赋值是否有紧接在':'或第一个' = '后面的未引号前缀。在这些情况下,还执行波浪膨胀。因此,可以在赋值给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