Bash/ZSH保留引号



有没有一种方法可以告诉bash/zsh根本不解析引号,而是逐字逐句地将其提供给shell函数?

$ argtest abc def "ghi jkl" $'mnotpqr' $'stunvwx'
abc
def
"ghi jkl"
$'mnotpqr'
$'stunvwx'

你可能在想我为什么不做

argtest abc def '"ghi jkl"' "$'mnotpqr'" "$'stunvwx'"

但是我试图创建的argtest函数试图包装其他可以具有noglob前缀的命令。所以我需要一种能够区分*'*'的方法。

zsh中,您可以使用q参数扩展标志,但它很乱。一个q根据需要转义单个字符;两个用单引号展开文本;三个双引号。(符号${:-stuff}只是扩展到:-之后的文本;它是一个允许您创建匿名参数的包装器。)

$ echo "foo bar"
foo bar
$ echo ${(qq):-"foo bar"}
'foo bar'
$ echo ${(qqq):-"foo bar"}
"foo bar"
$ argtest () {
function>   echo "$1"
function> }
$ argtest "foo bar"
foo bar
$ argtest ${(qqq):-"foo bar"}
"foo bar"

不,没有办法禁用shell的引号处理。

如果你为了自己的方便而想要这样做,阅读here文档或类似文档中的论点可能是可以接受的。

但是,如果你想让你的用户能够在shell提示符下写引号并保留它们,那么就没有办法做到这一点(除了写自己的shell)。

在bash中,您可以访问$BASH_COMMAND来查看正在执行的文本预解析命令。因此,虽然不能阻止shell解析参数列表,但可以查看其预先解析的状态。

然而,这只给了你整个论点;如果走这条路的话,你需要自己做拆线。因此,我认为这是一种不明智的做法。

最新更新