歴史的に、Bourneシェルには組み込みコマンドはtrue
ありませんでしたfalse
。true
代わりに、単に:
やのfalse
ようなエイリアスになりましたlet 0
。
:
true
古代のボーン由来のシェルへの移植性よりもわずかに優れています。簡単な例として、!
パイプライン演算子も||
リスト演算子もないことを検討してください(一部のBourneシェルの場合と同様)。これelse
により、if
ステートメントの句が終了ステータスに基づいて分岐する唯一の手段となります。
if command; then :; else ...; fi
以来if
空でない必要がthen
句やコメントを非空としてカウントされません、:
ノーオペレーションとして機能します。
現在(つまり、現代のコンテキストでは)、通常、:
またはのいずれかを使用できますtrue
。どちらもPOSIXで指定されており、true
読みやすいものもあります。ただし、興味深い違いが1つあります。これ:
は、いわゆるPOSIXの特別な組み込みであるのに対し、true
は通常の組み込みです。
シェルに組み込むには、特別な組み込みが必要です。通常のビルトインは「一般的に」組み込まれているだけですが、厳密に保証されているわけではありません。通常、ほとんどのシステムのPATH :
機能で名前が付けられた通常のプログラムはありませんtrue
。
おそらく最も重要な違いは、特別なビルトインの場合、ビルトインによって設定された変数(単純なコマンド評価中の環境であっても)がksh93を使用して次のようにコマンドが完了した後も持続することです。
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
Zshは、POSIX互換モードで動作している場合を除いて、GNU Bashと同様にこの要件を無視しますが、他のすべての主要な「POSIX sh派生」シェルは、ダッシュ、ksh93、およびmkshを含め、これを監視します。
もう1つの違いは、通常のビルトインと互換性がある必要があるexec
ことです。ここではBashを使用して説明します。
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
POSIXはまた、これは実装固有の詳細ですが、:
よりも高速である可能性があることを明示的に指摘していtrue
ます。