作为一个 bash 新手,我一直通过复制/粘贴 + github 升级我的 .bashrc,并且遇到了让:
我和谷歌都困惑的命令。例如: ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}
。
我的 .bashrc 中原本没有这个语句,而我在终端中输入了这些内容(->表示相关输出):
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> /Users/sh/.bash_completion.d
和:
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
echo $USER_BASH_COMPLETION_DIR
-> asdf
但:
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> asdf
我不明白!
1)冒号命令如何设置变量但不能覆盖设置的变量export
?
:
2)在某些.bashrc中使用背后的逻辑是什么?
使用 Mac 10.6.8
(脱离上下文包括关键字冒号只是为了帮助像我一样尝试搜索该术语的其他人)
答案1
:
是 shell 内置命令,基本上相当于true
命令。它通常用作无操作,例如在if
语句之后。您可以在来自 stack overflow 的这个问题。
基本上,这意味着如果尚未设置,则将${varname=value}
的值设置$varname
为,然后返回 $varname 的值。但是,如果您尝试在命令行中运行该命令,它将尝试运行返回的值。将 放在前面作为无操作可防止 bash 尝试运行该值。value
$varname
:
请注意,有两种略有不同的形式:
${varname:=value}
如果 varname 未设置或者为空,则将 varname 设置为值。
${varname=value}
仅当 varname 当前未设置时才设置 varname 的值(即,它不会将 varname 从“”更改为值)
(感谢 chepner 在评论中澄清这一点)。