这些命令的行为不同

  • 本文关键字:命令 linux bash shell
  • 更新时间 :
  • 英文 :


我很难理解为什么在不同的发行版上执行这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: ../..

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

output on ubuntu: &&/&&

不要使用backticks-更喜欢$(...)。在执行之前,Backticks会删除

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

变为:

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

因此将.替换为&字符。

output on kali: &&/&&~

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

output on ...: ../..

这应该是可以理解的。

output on ubuntu: ../..

Aaaan,这是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.

相关内容

  • 没有找到相关文章

最新更新