这个问题想了好久,一直不知道怎么查
这是:
x=`command -v r2g`
与此相同:
x="$(command -v r2g)"
还是和这个一样:
x=$(command -v r2g)
...如果是后者,我应该这样做来解决它吗?
x="`command -v r2g`"
这个问题想了好久,一直不知道怎么查
这是:
x=`command -v r2g`
与此相同:
x="$(command -v r2g)"
还是和这个一样:
x=$(command -v r2g)
...如果是后者,我应该这样做来解决它吗?
x="`command -v r2g`"
所有示例都是命令替换的变量赋值,因此它们是等价的。根据Gilles 的回答,在分配给变量的右手边不需要引用,因为那里不会发生分词。所以四个都OK。
如果它们是独立的,即不在分配中,那么您需要引用。与反引号相比,这种
$(...)
形式的优点是引号可以嵌套并分成多行,这就是为什么现在这种形式普遍受到青睐的原因。换句话说,您可以"$( echo "$var" )"
使用这种形式来保护内部扩展$var
和外部扩展$(...)
免受分词和文件名通配符的影响。如POSIX Shell 命令语言规范所示,嵌入式多行脚本不能使用反引号(左侧),但可以使用
$()
表单(右侧)。这四个示例在功能上是等效的。
反引号已过时,除非您使用 1970 年的 shell,如 Bourne shell(如 Heirloom),否则您不需要它们。主要问题是它们很难嵌套,试试:
在只有一个赋值的命令行的右侧,引用扩展是不必要的(但无害的),因为无论如何都认为扩展被引用:
但这并不总是正确的,命令 export 上的赋值被视为一个参数,并且将在某些 shell(不是在 bash 中)中被拆分和全局化:
相同的推理适用于
local
(局部变量赋值需要引号吗?)和declare
(以及其他一些)。你应该做的“修复它”是:
有时(对于可移植脚本):
是的,还应该引用反引号。
对于命令输出不包含空格的情况,这可能是首选 bash 样式的问题。
shellharden
这是该实用程序作者的引述,来自“如何在 bash 中安全地做事”:我也相信用 引用反引号
"
或(更好)重写它以使用$()
. 如果在使用反引号时命令输出包含空格或特殊字符,如果不引用表达式可能会出现问题。是的,根据这份文件,我的猜测看起来是正确的: https ://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md
它说: