一个什么都不做的命令,只不过是一个注释引导,但实际上是一个内置的shell,它的目的是什么?

它比每次调用在脚本中插入注释要慢40%左右,这可能取决于注释的大小。我认为唯一可能的原因是:

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true'
while : ; do command ; done

我想我真正想要的是它在历史上的应用。


当前回答

:的一个有用的应用程序是,如果您只对使用参数展开的副作用感兴趣,而不是实际将其结果传递给命令。

在这种情况下,您使用参数展开作为参数:或false,这取决于您想要的退出状态是0还是1。一个例子是

: "${var:=$1}"

由于:是内置的,它应该相当快。

其他回答

从历史上看,Bourne shell并没有内置的true和false命令。True被改成了:,false被改成了let 0。

:在可移植性方面比真实的稍微好一些。作为一个简单的例子,考虑没有!管道操作符或||列表操作符(就像一些古老的Bourne shell的情况一样)。这使得if语句的else子句成为基于退出状态进行分支的唯一方法:

if command; then :; else ...; fi

因为if要求一个非空的then子句和注释不算作非空,:作为一个no-op。

现在(在现代语境中)你通常可以用:或者true。两者都是由POSIX指定的,其中一些发现true更容易阅读。然而,有一个有趣的区别::是所谓的POSIX特殊内置,而true是常规内置。

Special built-ins are required to be built into the shell; Regular built-ins are only "typically" built in, but it isn't strictly guaranteed. There usually shouldn't be a regular program named : with the function of true in PATH of most systems. Probably the most crucial difference is that with special built-ins, any variable set by the built-in - even in the environment during simple command evaluation - persists after the command completes, as demonstrated here using ksh93: $ unset x; ( x=hi :; echo "$x" ) hi $ ( x=hi true; echo "$x" ) $ Note that Zsh ignores this requirement, as does GNU Bash except when operating in POSIX compatibility mode, but all other major "POSIX sh derived" shells observe this including dash, ksh93, and mksh. Another difference is that regular built-ins must be compatible with exec - demonstrated here using Bash: $ ( exec : ) -bash: exec: :: not found $ ( exec true ) $ POSIX also explicitly notes that : may be faster than true, though this is of course an implementation-specific detail.

它类似于Python中的传递。

一种用法是将一个函数存根,直到它被写入:

future_function () { :; }

你可以将它与反撇号(' ')结合使用来执行命令而不显示输出,如下所示:

: `some_command`

当然,你可以只执行some_command > /dev/null,但是:-version稍微短一些。

话虽如此,我不建议这样做,因为这会让人们感到困惑。它只是作为一个可能的用例出现在脑海中。

:的一个有用的应用程序是,如果您只对使用参数展开的副作用感兴趣,而不是实际将其结果传递给命令。

在这种情况下,您使用参数展开作为参数:或false,这取决于您想要的退出状态是0还是1。一个例子是

: "${var:=$1}"

由于:是内置的,它应该相当快。

我用它来轻松地启用/禁用变量命令:

#!/bin/bash
if [[ "$VERBOSE" == "" || "$VERBOSE" == "0" ]]; then
    vecho=":"     # no "verbose echo"
else
    vecho=echo    # enable "verbose echo"
fi

$vecho "Verbose echo is ON"

Thus

$ ./vecho
$ VERBOSE=1 ./vecho
Verbose echo is ON

这有助于编写干净的脚本。这不能用'#'完成。

同时,

: >afile

是保证'afile'存在但长度为0的最简单方法之一。