谁能解释一下这个命令是什么意思?
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所有子进程都可以使用它。
参数扩展中的连字符前真的没有冒号${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