这些命令的不同行为

发布于 2025-01-20 08:08:41 字数 460 浏览 0 评论 0原文

我无法理解为什么在不同发行版上执行时这 3 个命令的输出存在差异 你们能帮我理解为什么吗?

 printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
output on kali: &&/&&~    output on ubuntu: &&/&&

printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
output on kali: \.\./\.\.   output on ubuntu: ../..

printf "%s" "$(echo ../.. | sed 's/[.]/\\&/g')"
output on kali: \.\./\.\.     output on ubuntu: \.\./\.\.

I'm having trouble understanding why there is a difference in the outputs of these 3 commands when executed on different distributions
Could you guys help me understand why ?

 printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
output on kali: &&/&&~    output on ubuntu: &&/&&

printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
output on kali: \.\./\.\.   output on ubuntu: ../..

printf "%s" "$(echo ../.. | sed 's/[.]/\\&/g')"
output on kali: \.\./\.\.     output on ubuntu: \.\./\.\.

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

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

发布评论

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

评论(1

猫九 2025-01-27 08:08:41

Kali 使用 Zsh shell。 Ubuntu 使用 Bash shell。

ubuntu 上的输出:&&/&&

不要使用反引号 - 最好使用 $(...)。反引号在执行之前删除 \

printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`

变为:

printf "%s" $(echo ../.. | sed 's/[.]/\&/g')

因此将 . 替换为 & 字符。

kali 上的输出:&&/&&~

Zsh 配置中末尾的 ~ 表示不带换行符的命令的输出。

输出...: \.\./\.\.

这应该是可以理解的。

 在 ubuntu 上的输出:../..

啊啊,这是 Bash 5.0 周围最难的一个。命令替换的未加引号的结果会进行文件名扩展(也称为路径名扩展)。 \.\./\.\. 与目录路径 ../.. 匹配。 Bash 5.0 引入了一项更改,即使扩展结果没有任何通配符特殊字符,也会进行路径名扩展。

Bash 5.1 中逆转了这一变化。 Bash-5.1-alpha 可供下载 https://lists.gnu.org/archive/html/bug-bash/2019-01/msg00063.html

Kali uses Zsh shell. Ubuntu uses Bash shell.

output on ubuntu: &&/&&

Do not use backticks - prefer $(...). Backticks remove \ before execution.

printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`

becomes:

printf "%s" $(echo ../.. | sed 's/[.]/\&/g')

So replaces . by & character.

output on kali: &&/&&~

The ~ on the end in Zsh in your configuration represents output from a command without a newline.

output on ...: \.\./\.\.

That should be understandable.

 output on ubuntu: ../..

Aaaand this is the hard one around Bash 5.0. Unquoted result of command substitution undergo filename expansion (also called pathname expansion). The \.\./\.\. matches the directory path ../... Bash 5.0 introduced a change that would make the result of expansion undergo pathname expansion even if it doesn't have any globbing special characters.

The change was reversed in Bash 5.1. Bash-5.1-alpha available for download https://lists.gnu.org/archive/html/bug-bash/2019-01/msg00063.html.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文