我发现波浪号扩展在以下情况下不起作用:
$ 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=~/testprint_arg.pl的内容是
#!/usr/bin/perl
print $ARGV[0],"\n";根据Order of Shell processing的说法,壳牌将在“波浪式扩展”之前拆分单词。我注意到单词split实际上是不同的。结果不同的原因是什么?
发布于 2013-03-20 00:01:21
在外壳变量赋值中也会出现波浪号扩展,这与destdir=~/test类似。dest-dir=~/test和-destdir=~/test不需要,因为-不是变量名中的有效字符。尽管外壳程序不会将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=~/binhttps://stackoverflow.com/questions/15493928
复制相似问题