GNU Bash 組み込みの : (コロン) の目的は何ですか? 質問する

GNU Bash 組み込みの : (コロン) の目的は何ですか? 質問する

何もせず、コメント リーダーに過ぎないが、実際にはそれ自体がシェルの組み込みコマンドであるコマンドの目的は何ですか。

スクリプトにコメントを挿入するよりも、1 回の呼び出しあたり約 40% 遅くなります。これは、コメントのサイズによって大きく異なる可能性があります。考えられる唯一の理由は次の通りです。

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true'
while : ; do command ; done

私が本当に探しているのは、それが歴史的にどのような応用があったかということだと思います。

ベストアンサー1

歴史的に、Bourne シェルには組み込みコマンドとして と がありませんでした。true代わりに、は単に、 、のようなものにエイリアスされていました。falsetrue:falselet 0

:は、古い Bourne 由来のシェルへの移植性という点では、わずかに優れています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 と同様にこの要件を無視しますが、dash、ksh93、mksh を含む他のすべての主要な「POSIX sh 派生」シェルはこれに従います。

  • もう 1 つの違いは、通常の組み込み関数は互換性がなければならないことですexec。ここでは Bash を使用して示します。

    $ ( exec : )
    -bash: exec: :: not found
    $ ( exec true )
    $
    
  • POSIX では、 が:よりも高速になる可能性があることも明示的に記載されていますtrueが、これはもちろん実装固有の詳細です。

おすすめ記事