有什么区别? (命令替换)

有什么区别? (命令替换)
  1. printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
  2. printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
  3. printf "%s" "$(echo ../.. | sed 's/[.]/\\&/g')"

答案1

据我所知,没有,在这种特殊情况下,与字符串../..

第二个和第三个之间,带或不带引号没有太大区别该特定输入, 字符串../...但如果命令替换的输出包含空格或通配符,则会有差异,比较:

$ mkdir temp; cd temp; touch hello.txt
$ printf "%s" $(echo "foo * bar"); echo
foohello.txtbar
$ printf "%s" "$(echo "foo * bar")"; echo
foo * bar

看:引用 $(command $arg) 的正确方法是什么?


带反引号的版本是 的已弃用版本$(...),并且工作方式与 rt 不同。引用和转义。在反引号内,与 不同的是$(...),一组反斜杠用于命令替换,因此您会得到不同的结果。 (\\&转向\&,这使得 sed 打印文字&,因为&它本身对于 sed 来说是特殊的,并且剩余的反斜杠删除了特殊含义。)

看:$(stuff) 和 `stuff` 有什么区别?


此外,Bash 5.0 有一个错误/错误功能,其中反斜杠的存在足以使字符串被视为 glob,即使它不包含其他实际的 glob 字符。

第二个命令中未加引号的扩展的结果将被视为一个 glob,并且将以相同的方式\.\./\.\.变成,例如or will。 (路径名应该始终存在,即使是在 中。当然也可以匹配其他名称。)../...[.]/.[.].?/.?../../.?/.?

同样,failglob可能会被触发:

bash-5.0.3$ shopt -s failglob
bash-5.0.3$ echo $(echo 'xxxxxx\x')
bash5.0.3: no match: xxxxxx\x

(但只是echo xxxxxx\x不这样做。)

请参阅Bash-5.1-beta 公告 和例如bug-bash 邮件列表上的这个错误报告

相关内容