当作为选项传递时,shell代码扩展不起作用

时间:2013-03-19 07:40:07

标签: shell tilde-expansion

我发现代字号扩展不适用于以下情况:

$ 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,壳牌将在“波浪扩张”之前分词。而且我注意到单词分裂实际上是不同的。结果不同的原因是什么?

1 个答案:

答案 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