有没有办法告诉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
前缀的命令。所以我需要一种能够区分*
和'*'
的方法。
答案 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"