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

发布于 2024-08-12 18:41:16 字数 230 浏览 9 评论 0原文

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

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

错误总是:

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

For the command: /usr/bin/sh -c "ls 1`" (a backquote after 1).

How to make it run successfully? Adding a backslash before "`" does not work.
` is a special char as we know, and I tried surrounding it with single quote too (/usr/bin/sh -c "ls 1'`'"), but that doesn't work either.

The error always are:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暗恋未遂 2024-08-19 18:41:16

您需要转义反引号,但也需要转义反斜杠:

$ 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 `.

我强烈建议你避免在 第一名

You need to escape the backtick, but also escape the backslash:

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

The reason you have to escape it "twice" is because you're entering this command in an environment (such as a shell script) that interprets the double-quoted string once. It then gets interpreted again by the subshell.

You could also avoid the double-quotes, and thus avoid the first interpretation:

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

Another way is to store the filename in a variable, and use that value:

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

And finally, what you tried will work on some shells (I'm using bash, as for the above examples), just apparently not with your shell:

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

I strongly suggest you avoid such filenames in the first place.

十六岁半 2024-08-19 18:41:16

使用单引号代替:

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

Use single quotes instead:

/usr/bin/sh -c 'ls 1\`'
小鸟爱天空丶 2024-08-19 18:41:16
/usr/bin/sh -c "ls '1\`'"
/usr/bin/sh -c "ls '1\`'"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文