たとえば、次のように入力した場合:
echo Variable "$var" is not initialised.
そして
echo "Variable $var is not initialised."
フロントエンドの結果は(少なくとも私が知っている限り)まったく同じです。しかし、そのecho
観点から、コマンドの実行方法に違いがあるかどうかを知りたいです。
echo
すべてのパラメータが一度に受信されるので、パフォーマンスの観点から後者が速くなりますか?
ベストアンサー1
存在する
echo Variable "$var" is not initialised.
echo
5つの引数を(計算する場合は6つ)渡すecho
と、空白文字で区切られて出力され、改行文字で終了します。argv[0]
echo
存在する:
echo "Variable $var is not initialised."
1つのパラメータを渡します(計算すると2つecho
)。
この特別なケースとほとんどの場合、これは機能的に同じです。
2つ目は、シェルがコマンドを解析して実行する前に引数に格納する作業が少なく、引数を確認するecho
作業が少ないことを意味します。echo
これはパフォーマンスに大きな違いをもたらす可能性はありません。私のテストでは、いくつかのecho
/組み合わせ(組み込みのようshell
な)ではわずかな違いがありましたが、他の組み合わせではほとんど違いはありません。bash
複数のパラメータの代わりに1つのパラメータを渡す他の理由は次のとおりです。
引数の間に複数の空白が必要な場合に出力され
echo a b
ます。出力がa b
必要です。echo 'a b'
a b
echo "$opt" is an invalid option
などの一部のecho
実装(echo
組み込みなど)では、whileと一緒に(またはまたは...)を使用することbash
はできません。opt=-e
-E
-neE
echo "$opt is an invalid option"
2つのパラメータ(最初のパラメータを
echo foo bar
除く)を渡すとき、各パラメータの長さは3バイトです。つまり、2つのポインタ(64ビットシステムではポインタあたり8バイト)と8バイト(実際の文字列の文字列区切り文字を含む)なので、合計の長さは次のようになります。 64ビットシステムでは24バイトです。echo
\0
ポインタであり、8バイト
echo 'foo bar'
(合計16バイト)です。これecho
により、多数のパラメータを含む外部実行可能ファイルを呼び出すと、パラメータサイズの制限に早く到達することができます(ただし、Linuxには単一パラメータの最大サイズ(128KiB)に制限があります)。
とにかく、ランダムなデータ(たとえば、$var
内容がわからないデータ(ただし、ここでは文脈に数字と下線のみが含まれていることがわかります))の場合は、代わりに次のものをprintf
使用したいと思いますecho
。
printf >&2 '%s\n' "Variable $var is not initialised."
または:
printf >&2 'Variable %s is not initialised.' "$var"
(これはユーザーにエラーとして表示され、スクリプトによって生成された通常の出力の一部ではないため、ここからstderrに送信されます。)
この場合、フォーマットに加えてに渡す必要がありますprintf
。
このアプローチのもう1つの利点は、メッセージをユーザーの言語に翻訳し、サポートされているすべての言語Variable %s is not initialised.
でその形式で事前に作成された翻訳を提供できることです(そしてそれを検索するにはgettext
ksh93 / bashを使用してください)。$"..."