:和true和有什么不一样?


15

bash

$ type :
: is a shell builtin
$ type true
true is a shell builtin

看起来它们是相同的,但是它们没有给出相同的系统跟踪:

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

我尝试了diff strace bash -c : 2>:.txtstrace bash -c true 2>true.txt,但是除了内存位置之外,它们之间没有任何区别。

dash

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

好,所以他们不一样。help :并且help true不是很有用,它们在bash和中返回相同的值dash。它们之间是否有任何实际区别,只是:节省了三个字节并使脚本的可读性降低了?


Answers:


27

行为没有真正的区别。这两个命令均不执行任何操作,并以成功状态退出。 :强调什么都不做;true强调成功的地位。

strace true之所以有效,true是因为既是内置的shell又是外部命令(/bin/true);:只是一个内置的shell(没有/bin/:-尽管可能存在,并且可能在非常老的Unix系统上)。用bash尝试

type -a :
type -a true

两者同时存在的原因是历史性的。如果我没记错的话,有些非常早期的shell没有注释语法,因此:改用了do-nothing 命令。

中存在一些内部差异dash。查阅git://git.kernel.org/pub/scm/utils/dash/dash.git上的源代码,显示了中的一些不同代码路径eval.c,但是我无法产生任何其他明显不同的行为比的special输出中的单词要多type :


8
此外,UNIX的早期版本没有/bin/true/bin/false。该:命令有时也用于参数处理的副作用:: ${num_times:=10}
Arcege 2012年

5
:原来的标签指标,早在Bourne shell中是有一个祖先goto。显然:被滥用为评论指标并被卡住。
吉尔斯(Gilles)'“ SO-不要邪恶”

1
:作为goto的标签指示符的行为保留在Microsoft的伪Unix命令行克隆中command.com,并保留在其后继者中cmd.exe,而滥用::行注释的做法也是如此。
Sorpigal 2012年

8

在Bash中它们是相同的。查看builtins/colon.defBash-4.2源代码。

在您的命令中,strace true您实际上是在运行二进制文件,/bin/true而不是内置的bash true。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.