【问题标题】:Is there any way to break the Bash `quote` function?有什么办法可以打破 Bash 的 `quote` 功能?
【发布时间】:2014-01-14 20:53:51
【问题描述】:

Ubuntu (13.04) 中的 Bash 默认似乎有这个quote 功能:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

此函数应始终返回其第一个参数的正确 shell 转义版本。

是否有任何输入字符串会破坏此功能(即返回一个无法用于 shell 输入的字符串)?


例子:

quote "A string's but a string."

'A string'\''s but a string.'

quote "A newline *doesn't*
seem to break anything..."

'A newline *doesn'\''t*
seem to break anything...'

【问题讨论】:

  • 假设您可以在单引号字符串中包含转义的单引号,我想说有很多字符串无法用于 shell 输入。
  • 该函数似乎来自我的 Ubuntu 12.04 上的 /etc/bash_completion。环顾第 187 行
  • 我正在查看quote \' 的输出,但不确定输出应该代表什么。
  • @chepner 诀窍是尝试eval echo "$(quote \')"。如果可以,那就没问题了。
  • 或者,quote() { printf "%q" "$1"; }

标签: bash shell escaping


【解决方案1】:

它似乎是“防弹”。

shell 中的单引号项绝对是单引号之间的任何内容,而不是单引号。可以通过使用序列'\'' 来伪包含单引号,该序列终止一个引用,然后反斜杠引用该引用,然后重新开始一个新的引用。

这个替换就是函数所做的一切。

函数的输出是表示输入字符串的单引号语法。

该功能甚至解决了“process-substitution-swallows-trailing-newlines”问题。

通常,如果您有一些函数或命令输出多行,后跟一个或多个空行,然后使用进程替换捕获它,如下所示:

FOO=$(command)

尾随的空行消失了。由于quote 的输出用单引号括起来,字符串中的尾随换行符受到保护,因此可以正常工作:

FOO=$("a
b
c


")

echo "$FOO"
'a
b
c


'

很明显,quote 的输出是eval-ed,而quote 确保此eval 的结果是quote 的原始参数,没有任何意外扩展、拆分或剥离的空白。

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2018-08-22
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多