名前付きパイプに文字列を正しく書き込む方法とechoとprintfの違い

名前付きパイプに文字列を正しく書き込む方法とechoとprintfの違い

質問:

名前付きパイプにコマンドを送信し、エラーや「奇妙な」文字ではないコマンドのみが送信されることを確認する必要があります。

例:

私は以下を使用しています:

echo "command" > /path/to/namedPipe

これはうまくいきますが、間違ったキー入力がパイプに送信される可能性があるという奇妙なことがわかりました。たとえば、

echo "command" > /path/to/namedPipe straycharacters

その後、<command>両方と<straycharacters>名前付きパイプに書き込まれます。このようなことが起きるとは想像もできなかったが、ある場合には私のプログラムが本当に混乱になりました。また、echoには引用符が必要ないようです。私のコマンドは引用符を必要とせず、実際の引用符のみが必要です<command><command>パイプにのみ書くための最良の方法は何ですか?

考えられる解決策:

printf "command" > /path/to/namedPipe straycharacters

私の端末では印刷のみを行い、<command>印刷は行いません<straycharacters>。これまでは私のプログラムと互換性があるようです。しかし、新しい行を含まないように見えるという点で、echoとは少し異なります。

答え1

このコマンド

echo "command" > /path/to/namedPipe straycharacters

等しい

echo "command" straycharacters >/path/to/namedPipe

(比較するこれechoこの場合もすべてのオペランドを印刷しますstraycharacters。繰り返しますが、「動作する」ソリューションは次のとおりです。

printf "command" straycharacters >/path/to/namedPipe

単に「動作」する理由は、

  • command明らかに、シェルで文字通り解釈されないフラグメント(例:)は含まれません${PATH}
  • commandprintf文字通り解釈されなかった断片は明らかに含まれていません。メモは形式commandとして解釈されます(man 1 printf詳細情報を参照)。%sstraycharacters

commandそれを(および改行文字)渡す正しい方法は次のとおりです。

printf '%s\n' 'command' >/path/to/namedPipe    # straycharacters

どこ

  • \n改行文字の印刷を担当します。
  • straycharactersコメントに表示されます。
  • 文字通り渡される必要があるすべての文字列は一重引用符で囲まれています(たとえば、意図的にパラメータ置換に依存する場合は二重引用符が必要な場合がprintfあります)。command

コードに「間違っているかぎこちない文字」を含めるのは間違っています。これを無視する構文を見つけようとしないで、ゴミを削除して注意を払ってください。これにより、コードが素晴らしく清潔になります。

straycharactersそれ以外の場合でも、echo正しいツールではありません。バラよりなぜprintfがechoより優れているのですか?

関連情報