[解決済み] 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
私が本当に求めているのは、歴史的にどのような用途があったのかということですね。
どのように解決するのか?
歴史的に
ボーンシェルには
true
と
false
をビルトインコマンドとして使用することができます。
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
もちろん、これは実装に依存することではあるが。
関連
-
[解決済み] usr/bin/env bash」と「#!/usr/bin/bash」の違いは何ですか?
-
[解決済み] Bashスクリプトでスクリプトファイル名を知るには?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] 好ましいBashのシェバングとは?
-
[解決済み] bashスクリプトでset -eはどういう意味ですか?
-
[解決済み] 最初の引数を除くすべての引数を処理する(bashスクリプトの場合)
-
[解決済み】Bashスクリプトでクリップボードにパイプを接続する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 '\r': コマンドが見つかりません - .bashrc / .bash_profile [重複].
-
[解決済み] '\r': command not found - .bashrc / .bash_profile [duplicate].
-
[解決済み] バッシュ Vim.NET」が表示されたらVimを終了させる Warning: 出力先が端末でない"
-
[解決済み] (standard_in) 1: bash スクリプトのシンタックスエラー
-
[解決済み] cmake execute_process COMMAND [重複]。
-
[解決済み] ファイル内の大文字・小文字を区別しない文字列を grep するには?
-
[解決済み] AWS CLIのプロファイルを一時的に切り替えるには?
-
[解決済み] Bash - "fi ;;" の使い方は?
-
[解決済み] "while :" vs. "while true" [重複].
-
[解決済み] Bash における三項演算子 (?:)