6

我正在研究当前 Debian 7.4.0 wheezy 版本中 /etc/init.d/ 中的 System V 初始化脚本(但它也存在于其他以前的版本中)。在该文件夹中找到的几乎所有(来自现有服务)都以一个空行结尾,基本上只包含一个冒号 (:) 符号。甚至可以在那里找到用于编写您自己的初始化脚本的“骨架”模板文件也有这个。这是代码末尾的复制/粘贴:

esac

:

(那是case语句的结尾,然后是文件的结尾)

还有一点有意思的是没有exit 0或者exit $?调用,除非仅在 case 语句中的某些情况下,否则会调用它,所以看起来冒号似乎是它的一种替代品?完整的骨架文件代码在这里:https ://gist.github.com/ivankovacevic/9917139

那个冒号可能是什么,为什么?

4

2 回答 2

5

冒号是一个语法元素,本质上什么都不做,但返回 true。它可以在任何可以使用命令的地方使用。

有时在 sh(1) 需要语句的地方需要它。例如,这给出了一个错误:

if [ "$a" = "" ] ; then
  # comment out this part for now
  # echo yes
else
  echo no
fi

bash:意外标记“else”附近的语法错误

用 : 替换评论使其工作:

if [ "$a" = "" ] ; then
  # comment out this part for now
  : echo yes
else
  echo no
fi

很少需要在 shell 中显式使用“exit 0”;在没有退出语句的情况下,shell 脚本以最后一个命令的状态退出,这是一个刚刚执行的 shell 脚本

/bin/false

将给出退出状态 1:

$ echo $?
1

结肠在很大程度上是黑魔法,我从实验中了解到我对它知之甚少。

于 2014-04-01T14:41:11.623 回答
1

在 BASH中:返回 true 状态,只是替换 word true。除了保存字符或使其可读性降低之外,我认为在系统初始化脚本的末尾使用:as没有任何好处。exit 0

正如chepner指出的那样,:如果脚本是来源的,它将确保一个真实的状态而不退出 shell。

它也常用于使用!in 语句替换逻辑否定。

if [[ $var ]]; then
    :
else
    echo no
fi

是相同的:

if ! [[ $var ]]; then
    echo no
fi
于 2014-04-01T15:24:13.133 回答