Bash/ZSH保留引号

4
有没有办法告诉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前缀的命令。因此,我需要一种能够区分*'*'的方法。


XY问题。告诉我们你想让“argtest”如何工作,我们可以建议如何(如果有必要)最好地实现它。 - chepner
@chepner “我正在尝试创建一个函数来包装其他命令,这些命令可以具有noglob前缀。” - simonzack
我的意思是,你想要做什么样的包装?你能举个例子说明 noglob 如何与此相关吗? - chepner
1
“bash/zsh”是一个混乱的用语 - 当涉及到实现特定的细节时,它们是非常不同的shell,你很难在这里得到适用于两者的答案。 - Charles Duffy
顺便提一下,在区分 *'*' 的情况下,通常的方法是检查文件是否存在。如果存在,则将其视为全局扩展;如果不存在,则报告失败,假定它是一个无法扩展的错误全局。或者,要求调用者使用 shopt -s nullglob 并完全禁用未扩展的全局传递。 - Charles Duffy
3个回答

4
在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"

有趣的一篇。不是最易读的但很有趣。谢谢。 - Tyteck

2

不,无法禁用Shell的引号处理。

如果您只是为了方便自己,从here文档或类似方式读取参数可能是可以接受的。

但是,如果您希望用户能够在Shell提示符处编写引号并将其保留,除了编写自己的Shell之外,没有其他方法可以实现。


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

然而- 这只给您整个参数;如果使用这种方法,则需要自行进行字符串拆分。因此,我认为这是不明智的行动。


这对我的目的很有效,有没有zsh的等效物? - simonzack
我也不知道。坦白地说,我建议将其拆分为两个单独的问题——一个是关于bash的,另一个是关于zsh的。否则,这就像“C++/ObjC”一样——精通其中一种语言的人不太可能同样熟悉另一种语言。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接