有没有办法打破Bash` quote`功能?

时间:2014-01-14 20:53:51

标签: bash shell escaping

默认情况下,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...'

1 个答案:

答案 0 :(得分:1)

它似乎是"防弹"。

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

这个替换就是函数所做的全部。

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

该功能甚至击败了" process-substitution-swallows-trailing-newlines"问题。

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

FOO=$(command)

尾随的空行消失了。由于quote的输出包装在单引号中,因此字符串中的尾随换行符受到保护,允许此操作:

FOO=$("a
b
c


")

echo "$FOO"
'a
b
c


'

显然,quote的输出应为eval - ed,quote确保此eval的结果是{{1}的原始参数没有任何意外的扩展,分裂或剥离空白。