在 bash 脚本中哪个更惯用:`|| true` 或 `|| :`?

在 bash 脚本中哪个更惯用:`|| true` 或 `|| :`?

我不怎么写 shell 脚本,所以当我阅读时我有点惊讶的文档git submodule我看到了他们在本文档中使用的语法:

任何子模块中命令的非零返回都会导致处理终止。这可以通过添加|| :到命令末尾来覆盖。

我必须查找这|| :是强制命令成功退出的简写。每当我必须成功退出命令时,我都会使用|| true.被|| :认为更惯用吗?

答案1

true没有内置到 Bourne shell 中。一直都是(这是之前引入的:输入评论的方式)。#

而且由于它的打字时间较短,这可能是人们:更喜欢true.

请注意 POSIX shell 中的另一个区别(对于bash,仅在 POSIX 模式下): whiletrue是常规内置命令(甚至不必是内置命令),:特别的内置。这有一些影响,其中大多数在这种特殊情况下不太可能产生任何影响:

  • 如果:命令失败(包括由于重定向失败),则会导致 shell 退出。实际上,除非您将重定向传递给,否则这可能不会产生影响:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
    
  • 在 中var=value :,返回后var仍设置为,而不是在以下情况下:value:true

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1
    

另请注意, 可以在和系列|| true的 shell 中工作,但不能(但不能在 中取消)。rccsh|| :set -ecsh

|| :不等于:.它的意思是:以其他方式运行(也就是说,如果前面的管道失败)。

set -e
false

会导致 shell 由于set -e(也称为errexit选项)而退出,并false具有非零(失败)退出状态。如果set -e返回非零退出状态的命令被用作状况像:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :只能取消set -efalse || :取消 的效果set -e并将退出状态设置为0因此,更惯用的说法是我们要忽略命令的失败退出代码。大多数人会认为这样|| true更清晰(更清楚地传达意图)。

答案2

这些响应中的大多数都未能解决:.

首先,这个讨论与任何非 shell 无关。伯恩外壳( sh) 导数。也就是说,所有 Bourne 衍生 shell 都将true:视为同一件事。过去鼓励程序员使用:而不是true,因为:始终是内置的,而过去在某些情况下true并不总是内置的。

:有两个用途。它不是 的同义词#,但具有不同的功能。在 a 下调试脚本时set -x,使用的行将#被解析器删除并完全忽略,而使用的行将:被解析和评估。这在调试中非常有用,因为在-x这些行下面显示了它们并且显示了评估后的值。这就像print在代码中放入仅在-x模式下显示的语句。请小心后面的值,:因为它们是真实的代码,副作用可能会影响您的程序。

答案3

一般来说,在 bash 中,冒号:true是等效的。

是|| : 被认为更惯用吗?

我认为这是基于语境

如果你想要 a return value,或者 acondition总是 true,你应该使用true关键字,它会让你的代码更清晰,让观众知道你想要强调的值真的, IE:

while true; do something

或者

<commnad>
RETURN_VALUE= $? || true

如果你想没做什么,或者NOP在 shell 中,您应该使用冒号:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

或者

while conditon
do
    : # DO NOTHING HERE
done

相关内容