我发现代字号扩展不适用于以下情况:
$ 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";
根据Order of Shell processing,壳牌将在“波浪扩张”之前分词。而且我注意到单词分裂实际上是不同的。结果不同的原因是什么?
答案 0 :(得分:4)
Tilde扩展也发生在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