:と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)                           = ?

とを比較strace bash -c : 2>:.txtしてみましstrace bash -c true 2>true.txtたが、メモリの場所を除いて両者の違いを見つけることができませんでした。

dash

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

わかりましたので、それらは同じではありません。help :そしてhelp true非常に有用ではない、と彼らは同じでを返すbashdash:3バイトを節約し、スクリプトを読みにくくすることを除いて、それらの間に実際的な違いはありますか?


回答:


27

動作に実際の違いはありません。両方のコマンドは何もせず、成功ステータスで終了します。 :何もしないことを強調します。true成功したステータスを強調しています。

strace truetrueシェル組み込みコマンドと外部コマンド(/bin/true)の両方であるため、動作します。:はシェルに組み込まれているだけです(存在しません/bin/:が、おそらく非常に古いUnixシステムにありました)。bashでは、試してください

type -a :
type -a true

両方が存在する理由は歴史的です。正しく思い出せば、非常に初期のシェルにはコメント構文がなかったため、:代わりに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}
アルケージュ

5
:元々ラベルインディケーターでしたが、持っていたボーンシェルの先祖に戻りましたgoto。どうやら:コメントインジケータとして悪用され、立ち往生しているようです。
ジル「SO-停止されて悪」

1
:gotoのラベルインジケーターとしての動作は、Microsoftの擬似Unixコマンドラインクローンで保持され、行コメントの悪用の慣行と同様command.comに、後継バージョンのままです。cmd.exe::
ソルピガル

8

Bashでも同じです。builtins/colon.defBash-4.2のソースコードを見てください。

あなたのコマンドでは、bashビルトインtrueの代わりにstrace true実際にバイナリ/bin/trueを実行しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.