web-dev-qa-db-ja.com

ファイルのコンテンツをコマンド「echo」にリダイレクトする

my_file.txtという名前のファイルがあり、その内容は文字列Helloだけです。内容をコマンドechoにリダイレクトするにはどうすればよいですか?

コマンドlesscatmore...があることはわかっていますが、echoを使用して実行する必要があります。

私はこれを試しました:

$ cat my_file.txt | echo

そしてこれも:

$ echo < my_file.txt

ただし、どちらの場合も、stdoutには空白のみが表示され、my_file.txtの内容は表示されません。

どうすればできますか?

46
danielmbcn

必要なすべてをechoにリダイレクトできますが、それで何も行われません。 echoは標準入力を読み取りません。 argumentsスペース文字で区切られ、改行文字で終了する(そして、いくつかのecho実装で、エスケープシーケンスが展開されている、引数が始まっている、など) -がオプションとして扱われる可能性があります)。

echoにファイルのコンテンツを表示させたい場合は、そのコンテンツを引数としてechoに渡す必要があります。何かのようなもの:

echo "$(cat my_file.txt)"

$(...)は、末尾の改行文字を削除することに注意してくださいs そのcatコマンドの出力から、およびechooneを追加します。

また、zshを除いて、コマンドの引数にNUL文字を渡すことはできないため、上記は通常バイナリファイルでは機能しません。 yashは、有効な文字の一部を形成しないバイトも削除します。

echoにファイル内の\n\b\0351...エスケープシーケンスを拡張させたい場合(UNIX準拠のecho実装と同様、 ただし、すべてではない )、 代わりにprintfを使用する

printf '%b\n' "$(cat my_file.txt)"

echoとは異なり、そのファイルは移植可能であり、ファイルの内容が-で始まっていても問題はありません。


$(cat file)/ kshzshおよびbashの代わりに、次のこともできます:$(<file) 。これは、catとは対照的にShellがファイルの内容を読み取って拡張を構成する特殊な演算子です。 zshを除いて、NULバイトの末尾の改行とチョークを取り除きます。 bashでは、余分なプロセスがまだフォークされています。また、1つの違いは、ディレクトリタイプのファイルをそのように読み取ろうとしても、エラーが発生しないことです。また、$(< file)は特別ですが、$(< file; other command)は(zshでは、他のシェルをエミュレートしない場合、fileのコンテンツを拡張します) implicit$READNULLCMDコマンド(通常はポケットベル)を実行します)。

60

他の回答に加えて、catの代わりに入力リダイレクトを試すこともできます

_echo $(<my_file.txt)
_

または

_echo `<my_file.txt`
_

$()と ``は同じことを実行します。スコープ内でコマンドを実行し、ユーザーが入力として指定したかのようにシェルに出力を提供します。これら2つの違いは、$()が再帰的であり、 ``が再帰的ではないことです。

4
GypsyCosmonaut

言われたように、

echoでファイルのコンテンツを表示するには、そのコンテンツを引数としてechoに渡す必要があります。

たとえば、xargsを使用して次のように実行できます(バックスラッシュエスケープの解釈を有効にする必要があることを考慮してください)。

$ cat my_file.txt | xargs echo -e

または単にあなたが尋ねたもの(エスケープシーケンスの解釈なし):

$ cat my_file.txt | xargs echo
2
kenichi

簡単な答え:できません。 echo(Shellビルトインまたは通常のバイナリ)は、標準入力を処理しません-片道のみです。

2
peterph

Bashでは、以下も機能するはずです。

echo `cat my_file.txt`

バックティックで囲まれた部分は、そのコマンドの出力に置き換えられます。つまり、この場合、ファイルの内容に置き換えられます。

0
Motlib