新しい Linux ユーザーが最初に学ぶコマンドの 1 つは echo です。テキストを印刷したり、スクリプトをデバッグしたりする必要がありますか? echo ステートメントを追加します。ただし、私の使い方からすると、printf の方がはるかに強力であることがわかりました。基本を理解すると、スクリプトで出力を印刷するためのより安全なデフォルトになります。
echo の最大の問題の 1 つは、その動作が完全に標準化されていないことです。特にオプションやエスケープ シーケンスに関しては、シェルごとに処理方法が異なります。たとえば、 echo -n 実際に末尾の改行を抑制するか、そのまま出力するかはシェルに応じて異なります。次のようなエスケープ文字についても同様です。 または 。ある環境では動作し、別の環境では文字通り印刷される場合があります。
スクリプトに微妙なバグが発生する可能性があります。システム上では完璧に動作するスクリプトでも、別のマシンや別のシェルで実行すると動作が異なる場合があります。たとえば、zipgrep ツールは内部で echo を使用しますが、echo の予測できない動作により、zipgrep の使用法に問題が発生します。
printf コマンドは、POSIX 標準に従って明確に定義された動作を提供します。つまり、シェルとシステム間で同じように動作します。 echo はエスケープ シーケンスで失敗することがよくありますが、printf はそれらを適切に処理するため、bash スクリプトのより安全な代替手段となります。
printf は信頼性を超えて、echo にはない機能を提供します。フォーマットされた出力をサポートしているため、文字列、数値、変数の表示方法を制御できます。テキストを整列させ、小数点以下の桁数を制御し、複数の値を単一の予測可能な出力に結合することができます。単一のコマンドを使用してすべてを実行します。
# Alignment
printf "%-10s %s
" "User:" "$USER"
# Numeric output
printf "Usage: %.2f
" 3.141592
# Table output
printf "%-5s %s
" "CPU" "Usage"
printf "%-5s %d%%
" "core0" 42
printf "%-5s %d%%
" "core1" 37
# Multiple values, one format
printf "%s logged in at %s
" "$USER" "$TIME"スクリプトが成長するにつれて、これらの優れた機能に感謝し始めます。
echo から printf への切り替えは、最初は怖気づくかもしれませんが、ほとんどの一般的な使用例はきれいに、多くの場合より明示的に変換されます。最も簡単な置き換えは、テキストを改行で出力することです。 echo では、改行は暗黙的に行われます。 printf を使用すると、明示的に次のようになります。
echo "Hello, world"
printf "Hello, world
"冗長に見えるかもしれませんが、これは明確です 出力が予測可能になります。改行がいつ追加されるかを常に知ることができます。
改行を抑制すると、エコーの信頼性が低下するもう 1 つの一般的なケースがあります。一部のシェルはサポートしています echo -n、他の人は一貫した行動をしません。と printf、覚える選択肢はありません。改行を省略するだけです。
echo -n "Processing..."
printf "Processing..."変数の出力も、次のようにするとより安全になります。 printf。シェル展開ルールに依存するのではなく、変数の処理方法を正確に指定します。
echo $USER
printf "%s
" "$USER"これにより、変数にスペース、特殊文字、または予期しない値が含まれている場合に予期しない事態が回避されます。

シェルはコマンドを実行するだけではありません。ここでは、Bash がバックグラウンドで入力を拡張して、よりクリーンで信頼性の高いコマンドを作成できるようにする方法を説明します。
printf が特に優れているのは、構造化された出力が必要な場合です。テキストと値を組み合わせるのは簡単です。
echo "User: $USER | UID: $UID"
printf "User: %s | UID: %d
" "$USER" "$UID"printf を使用すると、各値のフォーマット方法を明示的に定義できるため、スクリプトの読み取りと保守が容易になります。同じことを echo で実行すると、特にスクリプトが大きくなると、すぐに煩雑になったり壊れやすくなったりします。
printf を使用すると、エスケープ シーケンスもより予測可能になります。
echo "Line 1
Line 2"
printf "Line 1
Line 2
"シェルによっては、echo が出力する場合があります 文字通り。しかし、printf は決してそうではありません。
この方法で出力を書き始めると、その利点が明らかになります。 printf コマンドは、ユーザーが何を望んでいるのかを推測しません。指定した内容を正確に印刷します。そのため、スクリプト、ログ、および信頼性が必要な出力のデフォルトとしてより適しています。
癖はあるものの、echo は悪いコマンドではありません。実際、ほとんどの Linux ユーザーは今でも毎日 Linux を使用していますが、それはまったく問題ありません。ターミナルで迅速かつ対話的に使用するには、echo が便利です。値を確認したり何かを簡単にデバッグするために文字列を出力するだけの場合は、echo を使用すると最小限の入力で作業を完了できます。
たとえば、対話型シェル セッションでは、これは完全に合理的です。
echo "$PATH"このような状況では、携帯性や厳密な出力制御は通常は問題になりません。出力の利用者はあなただけなので、何か問題があるかどうかをすぐに確認できます。
printf が真価を発揮するのは、スクリプトや再利用されるあらゆるものです。出力が別のコマンドによって消費される場合、ファイルに書き込まれる場合、またはシステム間で同じように動作すると予想される場合は、printf を選択する方が安全です。その一貫性により、スクリプトはより予測可能になり、長期にわたる保守が容易になります。
経験則として、迅速でインタラクティブな出力と 1 回限りのチェックには echo を使用します。スクリプト、ログ、および出力形式が重要な場合はどこでも printf を使用します。エコー オプションやエスケープ シーケンスに依存していることに気付いた場合、それは通常、printf の方が優れたツールであることを示しています。

正しいコマンドを知っていれば、これらのイースターエッグは Ubuntu Linux で発見されるのを待っています。
echo コマンドは、Linux ツールボックスに組み込まれています。シンプルで親しみやすく、簡単なチェックには十分です。しかし、アウトプットが重要な場合、シンプルさだけでは十分ではありません。 printf コマンドを使用すると、一貫性、制御性、明瞭さが得られます。