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