【问题标题】:Bash/ZSH preserve quotesBash/ZSH 保留引号
【发布时间】:2014-08-30 13:32:53
【问题描述】:

有没有办法告诉 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 “我正在尝试创建一个函数来包装可以具有 noglob 前缀的其他命令。”
  • 我的意思是,你想要什么样的包装?你能举个例子说明noglob 是如何适应这个的吗?
  • "bash/zsh" 是一个混乱的词组——当你进入特定于实现的细节时,它们是非常不同的 shell,你不太可能在这里获得适用于他们两者的答案。
  • 顺便说一句——在*'*' 之间的区别很重要的上下文中,通常的方法是检查文件是否存在。如果存在,则将其视为 glob 扩展;如果没有,则假设它是一个未扩展的坏球体,则报告失败。或者,要求您的调用者使用 shopt -s nullglob 并完全禁用未扩展 glob 的文字传递。

标签: bash shell zsh


【解决方案1】:

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

如果您为了自己的方便而希望这样做,则可以从此处的文档或类似文档中阅读参数。

但是,如果您希望您的用户能够在 shell 提示符下写引号并保留它们,则没有办法做到这一点(除了编写自己的 shell)。

【讨论】:

    【解决方案2】:

    zsh中,可以使用q参数扩展标志,但是比较乱。一个q 根据需要转义单个字符; 2 在单引号中展开文本;三个双引号。 (符号${:-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"
    

    【讨论】:

    • 有趣的一个。不是最易读但有趣的。谢谢。
    【解决方案3】:

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

    但是——这只会给你整个论点;如果走这条路,您需要自己进行字符串拆分。因此,我认为这是一种不明智的做法。

    【讨论】:

    • 这适用于我的目的,有 zsh 等价物吗?
    • 如果我知道该死的。坦率地说,我建议将其分成两个单独的问题——一个针对 bash,一个针对 zsh。否则,它就像“C++/ObjC”——一个专家不太可能熟悉另一个。
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 2010-12-12
    • 2021-11-11
    • 2021-07-15
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多