Bash / ZSH保留报价

时间:2014-08-30 13:32:53

标签: bash shell zsh

有没有办法告诉bash / zsh根本不解析引号,而是逐字地将它们提供给shell函数?

$ argtest abc def "ghi jkl" $'mno\tpqr' $'stu\nvwx'
abc
def
"ghi jkl"
$'mno\tpqr'
$'stu\nvwx'

你可能在想我为什么不这样做

argtest abc def '"ghi jkl"' "$'mno\tpqr'" "$'stu\nvwx'"

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

3 个答案:

答案 0 :(得分:2)

不,没有办法禁用shell的报价处理。

如果您希望这是为了您自己的方便,可以接受来自此处文档或类似文件的参数。

但是,如果您希望您的用户能够在shell提示符下编写引号并保留它们,则无法执行此操作(没有编写自己的shell)。

答案 1 :(得分:1)

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

然而 - 这只给你整个论点;如果走这条路,你需要自己进行字符串分割。因此,我会将此描述为一种不明智的行动方式。

答案 2 :(得分:0)

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"