${GZIP_BINDIR-'/bin'} 在 bash 中是什么意思?

Ras*_*ari 13 bash

谁能解释一下这个命令是什么意思?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 19

${GZIP_BINDIR-'/bin'}是一个bash参数扩展模式。来自man bash

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.
Run Code Online (Sandbox Code Playgroud)

在此部分之前,手册页有(感谢@jwodder 的通知):

Omitting the colon results in a test only for a parameter that is unset.
Run Code Online (Sandbox Code Playgroud)

正如手册页所说,它将设置变量的默认值GZIP_BINDIR。如果GZIP_BINDIR先前设置了一个值(除了您没有使用的 null :),则将使用该值,否则/bin将用作变量的值GZIP_BINDIR

另一方面,如果您也想测试空值,请使用此模式(包括:):

${GZIP_BINDIR:-'/bin'}
Run Code Online (Sandbox Code Playgroud)

之后$PATH将扩展到它之前持有的值。所以,如果PATH以前有:

/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)

现在您PATH将是(考虑GZIP_BINDIR未设置):

/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)

export PATH将使PATH所有子进程都可以使用它。


Doc*_*ger 8

参数扩展中的连字符前真的没有冒号${GZIP_BINDIR-'/bin'}吗?

这种构造几乎总是用冒号书写,${GZIP_BINDIR:-'/bin'}这意味着“如果 $GZIP_BINDIR 为 NULL 或未设置,则将其设置为 '/bin'”

但是,您提供的语法有效的,但很少见。${GZIP_BINDIR-'/bin'}(无冒号)表示“如果未设置 $GZIP_BINDIR,请将其设置为 '/bin'”。如果它已设置(已声明)但没有分配给它(例如它是 NULL),则不会插入任何内容。

这里可能有一个bug,虽然作为结肠以下变量构造(...} :$ PATH ...)仍然被插入,如果$ GZIP_BINDIR是一套,但NULL。由于这会在 $PATH 的开头添加一个冒号,因此会导致首先搜索当前目录。

大多数人认为这是一个安全问题,因为只需将其放在当前目录中,就可以更容易地运行与标准命令同名的恶意程序。

如果 $GZIP_BINDIR 设置但 NULL(空),要保持 $PATH 不变,正确的语法是 ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

如果 $GZIP_BINDIR 未设置或设置但为 NULL,要保持 $PATH 不变,正确的语法是 ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH