質問: ファイルのコンテンツをコマンド「echo」にリダイレクトする my_file.txtという名前のファイルがあり、その内容は文字列helloだけです。内容をコマンドechoにリダイレクトするにはどうすればよいですか?コマンドless、cat、more...があることはわかっていますが、echoを使用して実行する必要があります。私はこれを試しました:$ cat my_file.txt | echo そしてこれも:$ echo < my_file.txt ただし、どちらの場合も、stdoutには空白のみが表示され、my_file.txtの内容は表示されません。どうすればできますか?
回答: 必要なすべてをechoにリダイレクトできますが、それで何も行われません。 echoは標準入力を読み取りません。 argumentsスペース文字で区切られ、改行文字で終了する(そして、いくつかのecho実装で、エスケープシーケンスが展開されている、引数が始まっている、など) -がオプションとして扱われる可能性があります)。echoにファイルのコンテンツを表示させたい場合は、そのコンテンツを引数としてechoに渡す必要があります。何かのようなもの:echo "$(cat my_file.txt)" $(...)は、末尾の改行文字を削除することに注意してくださいs そのcatコマンドの出力から、およびechoはoneを追加します。また、zshを除いて、コマンドの引数にnul文字を渡すことはできないため、上記は通常バイナリファイルでは機能しません。 yashは、有効な文字の一部を形成しないバイトも削除します。echoにファイル内の\n、\b、\0351...エスケープシーケンスを拡張させたい場合(unix準拠のecho実装と同様、 ただし、すべてではない )、 代わりにprintfを使用する :printf '%b\n' "$(cat my_file.txt)" echoとは異なり、そのファイルは移植可能であり、ファイルの内容が-で始まっていても問題はありません。$(cat file)、 / ksh、zshおよびbashの代わりに、次のこともできます:$(<file) 。これは、catとは対照的にshellがファイルの内容を読み取って拡張を構成する特殊な演算子です。 zshを除いて、nulバイトの末尾の改行とチョークを取り除きます。 bashでは、余分なプロセスがまだフォークされています。また、1つの違いは、ディレクトリタイプのファイルをそのように読み取ろうとしても、エラーが発生しないことです。また、$(< file)は特別ですが、$(< file; other command)は(zshでは、他のシェルをエミュレートしない場合、fileのコンテンツを拡張します) implicit $readnullcmdコマンド(通常はポケットベル)を実行します)。