Bash 脚本中行开头的“:”有何用途?

Bash 脚本中行开头的“:”有何用途?

:Bash 脚本中行首的用途是什么?

:我在行首看到了一些用法,如下面的代码片段所示:

cgcreate -g "$cgroups:/$uuid"
: "${BOCKER_CPU_SHARE:=512}" && cgset -r cpu.shares="$BOCKER_CPU_SHARE" "$uuid"
: "${BOCKER_MEM_LIMIT:=512}" && cgset -r memory.limit_in_bytes="$((BOCKER_MEM_LIMIT * 1000000))" "$uuid"

实验表明,其:功能很像注释 ( #),因为没有任何内容打印到标准输出;但是,: $(echo foo > bar)会创建一个新文件bar,因此代码会执行。

答案1

$ help :
:: :
    Null command.
    
    No effect; the command does nothing.
    
    Exit Status:
    Always succeeds.

它与 是相同的命令true(除了 给出的描述help不同)。

尤其,这是一个常规命令,不是语法元素,因此与注释不同,命令行的其余部分需要是有效的 shell 语法,并且任何扩展仍然会发生。

例如,在您的示例中,"${BOCKER_CPU_SHARE:=512}"是 set-default-value 扩展,512如果变量未设置或为空,它将设置为:

$ foo=
$ : "${foo:=512}"
$ echo "$foo"
512

$ foo=42
$ echo ${foo:=512}       # no change since already has value
42

在某种程度上,该扩展是 的缩写if [ -z "$foo" ]; then foo=512; fi,但仅用作扩展,因此需要一些命令来配合它。 And:是经常用于此目的的一个,因为它本身不执行任何操作。

不过,我不确定&&这有什么意义,因为:它总是真实的,所以可以写成

: "${BOCKER_CPU_SHARE:=512}"
cgset -r cpu.shares="$BOCKER_CPU_SHARE" "$uuid"

ETC。

相关内容