lis*_*per 5 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
Run Code Online (Sandbox Code Playgroud)
print_arg.pl的内容是
#!/usr/bin/perl
print $ARGV[0],"\n";
Run Code Online (Sandbox Code Playgroud)
根据Shell的处理顺序,壳牌将在"波浪扩张"之前分词.而且我注意到单词分裂实际上是不同的.结果不同的原因是什么?
波浪号扩展也发生在 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:
\n\n\n\n\n每个变量分配都会检查紧跟在 \xe2\x80\x98:\xe2\x80\x99 或第一个 \xe2\x80\x98=\xe2\x80\x99 后面的未加引号的波形符前缀。在这些情况下,还会执行波形符扩展。因此,可以在 PATH、MAILPATH 和 CDPATH 的分配中使用带波形符的文件名,并且 shell 分配扩展值。
\n
请注意,通过-k设置选项,正确的变量分配将按原样处理,并从传递给的参数列表中删除print_arg.pl:
~ $ set -kx\n~ $ ./print_arg.pl destdir=~/bin foo\n+ destdir=/Users/clint/bin\n+ ./print_arg.pl foo\nfoo\n~ $ ./print_arg.pl dest-dir=~/bin foo\n+ ./print_arg.pl \'dest-dir=~/bin\' foo\ndest-dir=~/bin\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |