在shell中用双引号字符串转义反引号

时间:2009-12-01 05:27:28

标签: shell quotes quoting backticks

对于命令:/ usr / bin / sh -c“ls 1`”(1之后的反引号)。

如何让它成功运行?在“`”之前添加反斜杠不起作用。 `我们知道这是一个特殊的字符,我也尝试用单引号括起来(/ usr / bin / sh -c“ls 1'`'”),但这也不起作用。

错误总是:

% /usr/bin/sh -c "ls 1\`"
Unmatched `

3 个答案:

答案 0 :(得分:43)

你需要逃避反引号,但也要逃避反斜杠:

$ touch 1\`
$ /bin/sh -c "ls 1\\\`"
1`

您必须“两次”转义它的原因是因为您在一个环境(例如shell脚本)中输入此命令,该环境会解释双引号字符串一次。然后由子shell再次解释。

你也可以避免使用双引号,从而避免第一种解释:

$ /bin/sh -c 'ls 1\`'
1`

另一种方法是将文件名存储在变量中,并使用该值:

$ export F='1`'
$ printenv F
1`
$ /bin/sh -c 'ls $F'  # note that /bin/sh interprets $F, not my current shell
1`

最后,你尝试过的东西会对一些shell有用(我正在使用bash,就像上面的例子一样),显然不是你的shell:

$ /bin/sh -c "ls 1'\`'"
1`
$ csh  # enter csh, the next line is executed in that environment
% /bin/sh -c "ls 1'\`'"
Unmatched `.

我强烈建议您在first place中避免使用此类文件名。

答案 1 :(得分:4)

改为使用单引号:

/usr/bin/sh -c 'ls 1\`'

答案 2 :(得分:0)

 /usr/bin/sh -c "ls '1\`'"