:とtrueと?の違いは何ですか?

:とtrueと?の違いは何ですか?

存在する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あまり役に立ちませんし、bashと同じ値を返しますdash。 3バイトを節約し、スクリプトを読みにくくすることに加えて、:実質的な違いはありますか?

ベストアンサー1

行動に実質的な違いはありません。どちらのコマンドも何も実行せず、成功状態で終了します。 :何もしないことを強調し、true成功の状態を強調しなさい。

strace truetrueこれはシェルの組み込みおよび外部コマンド(/bin/true)なので機能します。:ただシェル組み込み(何もありません/bin/:- あるかもしれませんし、おそらく非常に古いUnixシステムにあるかもしれません)。 Bashで試してみてください

type -a :
type -a true

どちらも存在する理由は歴史的です。私の記憶が正しい場合、一部の初期シェルにはコメント構文がなかったため、:何もしないコマンドが使用されました。

内部的に若干の違いがありますdash。ソースコード(git://git.kernel.org/pub/scm/utils/dash/dash.gitで利用可能)を見ると、いくつかの異なるコードパスが表示されますが、テキストとはeval.c大きく異なる動作を生成することはできません。special出力type :

おすすめ記事