printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
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 来说是特殊的,并且剩余的反斜杠删除了特殊含义。)
此外,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
不这样做。)