![在 bash 脚本中哪个更惯用:`|| true` 或 `|| :`?](https://linux22.com/image/32695/%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%93%AA%E4%B8%AA%E6%9B%B4%E6%83%AF%E7%94%A8%EF%BC%9A%60%7C%7C%20true%60%20%E6%88%96%20%60%7C%7C%20%EF%BC%9A%60%EF%BC%9F.png)
我不怎么写 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 中工作,但不能(但不能在 中取消)。rc
csh
|| :
set -e
csh
|| :
不等于:
.它的意思是或:
以其他方式运行(也就是说,如果前面的管道失败)。
set -e
false
会导致 shell 由于set -e
(也称为errexit
选项)而退出,并false
具有非零(失败)退出状态。如果set -e
返回非零退出状态的命令被用作状况像:
if false; then ...
while false; do ...
false && : ...
false || : ...
false && :
只能取消set -e
。false || :
取消 的效果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