:
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。