printf
bashの関数と関数の違いは何ですかecho
?
具体的には、以下を実行します。
echo "blah" >/dev/udp/localhost/8125
8125を受信したサーバーに「おそらく」コマンドが送信されませんでした。
printf "blah" >/dev/udp/localhost/8125
データが送信されました。 printfは出力の終わりに追加のEOFを送信しますか?
答え1
どちらも組み込みコマンドecho
です(1998年v2.0.2以降、Bashに組み込まれています)。常に状態0で終了し、単に標準出力に引数を出力し、行終端文字を表示し、フォーマット文字列を定義し、失敗した場合はゼロ以外の終了ステータスコードを提供します。printf
printf
echo
printf
printf
出力形式をより効果的に制御できます。プロジェクトで使用するフィールドの幅だけでなく、数値のさまざまな書式設定オプション(使用する出力基準、インデックスを印刷するか、シンボルを印刷するか、後で印刷する桁数など)を指定するために使用できます。 )。小数点)。これは、他のパラメータの印刷方法と場所を制御する形式の文字列を提供することによって行われ、C言語(%03d
、、、...)と同じ構文を持ちます。これは、format()を議論しないときにパーセント記号をエスケープする必要があることを意味します。%e
%+d
%%
echo
おそらく、デフォルトで使用される改行文字を追加すると(-n
オプションを使用する場合を除く)、同じ効果が得られます。
printf "blah\n" >/dev/udp/localhost/8125
パフォーマンスに関しては、文字列を読み取ってフォーマットする必要があるecho
後者よりもこれが速いと常に考えていました。printf
しかし、time
(組み込みの)テストでは、次のような結果が出ました。
$ time for i in {1..999999}; do echo "$i" >/dev/null; done
real 0m10.191s
user 0m4.940s
sys 0m1.710s
$ time for i in {1..999999}; do printf "$i" >/dev/null; done
real 0m9.073s
user 0m4.690s
sys 0m1.310s
デフォルトでは、次printf
のように改行を追加するように指示します。echo
$ time for i in {1..999999}; do printf "$i\n" >/dev/null; done
real 0m8.940s
user 0m4.230s
sys 0m1.460s
これは印刷しないよりもはるかに遅いですが、\n
印刷するよりも高速ですecho
。
答え2
違いは、出力のecho
末尾に改行文字を送信することです。 EOFを「送信する」方法はありません。
答え3
これはおそらくechoとprintfの最良の説明です。
http://www.in-ulm.de/~mascheck/various/echo+printf/
非常に高いレベルで.. printfはechoに似ていますが、より多くの書式を設定できます。
答え4
文字列「-e」を文字通り印刷するには、echoを使用するのが困難です。最近スクリプトの作成中にこの問題が発生しました。
リテラル文字列 "-e"を印刷するには、prinfを使用する必要があります。