一个什么都不做的命令,只不过是一个注释引导,但实际上是一个内置的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

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


当前回答

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

: `some_command`

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

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

其他回答

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

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

: "${var:=$1}"

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

另一种方法,这里还没有提到的是在无限while循环中初始化参数。下面不是最清晰的示例,但它达到了它的目的。

#!/usr/bin/env bash
[ "$1" ] && foo=0 && bar="baz"
while : "${foo=2}" "${bar:=qux}"; do
    echo "$foo"
    (( foo == 3 )) && echo "$bar" && break
    (( foo=foo+1 ))
done

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

#!/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的最简单方法之一。

其他答案中没有提到的两个用法:

日志记录

以这个示例脚本为例:

set -x
: Logging message here
example_command

第一行set -x使shell在运行命令之前打印出该命令。这是一个非常有用的结构。缺点是通常的echo Log消息类型的语句现在打印两次消息。冒号方法避开了这个问题。请注意,您仍然必须转义特殊字符,就像您对echo所做的那样。

Cron职位名称

我看到它在cron作业中被使用,像这样:

45 10 * * * : Backup for database ; /opt/backup.sh

这是一个cron作业,每天在10:45运行脚本/opt/backup.sh。这种技术的优点是,当/opt/backup.sh打印一些输出时,它使电子邮件主题看起来更好看。

:也可以是块注释(类似于C语言中的/* */)。例如,如果你想在脚本中跳过一段代码,你可以这样做:

: << 'SKIP'

your code block here

SKIP