首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当作为选项传递时,shell代字号扩展不起作用

问当作为选项传递时,shell代字号扩展不起作用
EN

Stack Overflow用户
提问于 2013-03-19 15:40:07
回答 1查看 430关注 0票数 5

我发现波浪号扩展在以下情况下不起作用:

代码语言:javascript
复制
$ 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的内容是

代码语言:javascript
复制
#!/usr/bin/perl
print $ARGV[0],"\n";

根据Order of Shell processing的说法,壳牌将在“波浪式扩展”之前拆分单词。我注意到单词split实际上是不同的。结果不同的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的参数列表中删除

代码语言:javascript
复制
~ $ 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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15493928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档