当作为选项传递时,Shell波浪扩展不起作用



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

$ 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上执行波浪展开。

从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

相关内容

  • 没有找到相关文章

最新更新