: bash 的冒号命令

sh5*_*h54 38 bash

作为一个 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
Run Code Online (Sandbox Code Playgroud)

和:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
echo $USER_BASH_COMPLETION_DIR
-> asdf
Run Code Online (Sandbox Code Playgroud)

但:

: ${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
Run Code Online (Sandbox Code Playgroud)

我不明白!

1) 冒号命令如何设置变量但不能覆盖设置的变量export

2):在某些 .bashrc 中使用背后的逻辑是什么?

使用 Mac 10.6.8

(在上下文中包含关键字冒号只是为了帮助像我这样试图搜索该术语的其他人)

Ham*_*ner 58

:是一个 shell 内置true命令,基本上等同于命令。它通常用作无操作,例如在if语句之后。您可以在stack overflow 的这个问题中阅读更多相关信息。

${varname=value}基本手段设定的值$varname,以value如果$varname尚未设置,然后返回$ VARNAME的值。但是,如果您尝试在命令行上运行它,它将尝试运行返回的值。将 放在:前面作为无操作可防止 bash 尝试运行该值。

请注意,有两种略有不同的形式:

${varname:=value}
Run Code Online (Sandbox Code Playgroud)

如果 varname 未设置或为空,则将 varname 设置为 value。

${varname=value}
Run Code Online (Sandbox Code Playgroud)

如果 varname 当前未设置,则仅设置 varname 的值(即,它不会将 varname 从 "" 更改为值)

(感谢 chepner 在评论中澄清这一点)。

其他人引用此方法