1. ホーム
  2. bash

[解決済み] GNU Bashの組み込み関数 : (コロン) は何のためにあるのですか?

2022-03-23 02:53:54

質問

何もしない、コメントリーダーに過ぎないが、実はそれ自体がシェルのビルトインであるコマンドの目的は何でしょうか?

スクリプトにコメントを挿入するよりも、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

私が本当に求めているのは、歴史的にどのような用途があったのかということですね。

どのように解決するのか?

歴史的に ボーンシェルには truefalse をビルトインコマンドとして使用することができます。 true は単にエイリアスとして : であり false のようなものに変更します。 let 0 .

: の方が若干良い。 true は、古くからのBourne由来のシェルへの移植性に優れています。簡単な例として ! パイプライン演算子と || リスト演算子(昔のBourneシェルのいくつかはそうであった)。このため else の節は if ステートメントを、終了ステータスによる分岐の唯一の手段として使用します。

if command; then :; else ...; fi

以降 if は空でない then 節があり、コメントは空でないものとしてカウントされません。 : は、no-opとして機能します。

現在では (つまり、現代的な文脈では) 通常は以下のどちらかを使うことができます。 : または true . どちらも POSIX で規定されているものですが、中には true の方が読みやすい。しかし、ひとつだけ興味深い違いがあります。 : は、いわゆるPOSIX 特殊な組み込み 一方 true 正規の組み込み .

  • 特殊なビルトインはシェルに組み込まれる必要があります。通常のビルトインは "typically" だけですが、厳密に保証されるわけではありません。という名前の通常のプログラムは通常存在しないはずです。 : という機能を持つ true を、ほとんどのシステムのPATHに追加してください。

  • おそらく最も重要な違いは、特別なビルトインでは、ビルトインによって設定されたすべての変数が、たとえ単純なコマンド評価中の環境であっても、コマンドが完了した後も持続することです(ここでは ksh93 を使用して実証されています)。

    $ unset x; ( x=hi :; echo "$x" )
    hi
    $ ( x=hi true; echo "$x" )
    
    $
    
    

    ZshはPOSIX互換モードで動作している場合を除き、GNU Bashと同様にこの要件を無視しますが、dash、ksh93、mkshを含む他のすべての主要な" POSIX sh派生" シェルはこの要件を守っていることに注意してください。

  • もう一つの違いは、通常のビルトインが exec - ここでは、Bashを使って実証しています。

    $ ( exec : )
    -bash: exec: :: not found
    $ ( exec true )
    $
    
    
  • また、POSIXは以下のことを明示的に記しています。 : よりも速いかもしれません。 true もちろん、これは実装に依存することではあるが。