質問:
名前付きパイプにコマンドを送信し、エラーや「奇妙な」文字ではないコマンドのみが送信されることを確認する必要があります。
例:
私は以下を使用しています:
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}
。command
printf
文字通り解釈されなかった断片は明らかに含まれていません。メモは形式command
として解釈されます(man 1 printf
詳細情報を参照)。%s
straycharacters
command
それを(および改行文字)渡す正しい方法は次のとおりです。
printf '%s\n' 'command' >/path/to/namedPipe # straycharacters
どこ
\n
改行文字の印刷を担当します。straycharacters
コメントに表示されます。- 文字通り渡される必要があるすべての文字列は一重引用符で囲まれています(たとえば、意図的にパラメータ置換に依存する場合は二重引用符が必要な場合が
printf
あります)。command
コードに「間違っているかぎこちない文字」を含めるのは間違っています。これを無視する構文を見つけようとしないで、ゴミを削除して注意を払ってください。これにより、コードが素晴らしく清潔になります。
straycharacters
それ以外の場合でも、echo
正しいツールではありません。バラよりなぜprintfがechoより優れているのですか?