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


41

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

私は、コマンドを持って知っているless、cat、more...しかし、私はそれを行う必要がありますecho。

私はこれを試しました:

$ cat my_file.txt | echo

またこれ:

$ echo < my_file.txt

ただし、どちらの場合も、my_file.txtのコンテンツではなく、stdoutに空白のみが表示されます。

どうすればそれができますか?


7
なぜあなたは使用を主張しechoますか?
— ケビン

7
@Kevinは、おそらく最終的に、ファイル内のANSI Cエスケープシーケンス(\n、b...)を展開したいと考えています。これはecho(少なくとも標準echo)の有効な使用方法です。または、おそらく彼はそれがそのように機能しない理由を理解したいと考えています。いずれにせよ、IMOに投票する理由はありません。
— ステファンシャゼル

3
echo <file.txtを実行するとなぜ機能しないのか興味があったので、ここに来ました。SEには合理的な質問があるように思われますが、答えは非常に役に立ちました。私から+1。
— ニューロネット

回答:


53

あなたが望むすべてをリダイレクトすることができますが、それで echo何もしません。echo標準入力を読み取りません。スペース文字で区切られ、改行文字で終了する引数を標準出力に書き込むだけです(さらに、一部のecho実装ではエスケープシーケンスを展開したり-、オプションとして処理される引数で始まるものもあります)。

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

echo "$(cat my_file.txt)"

そのコマンドの出力から$(...)末尾の改行文字sを取り除きcat、1つecho追加することに注意してください。

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

それをやりたいと思った理由は、あなたがしたいのであればecho展開する\n、\b、\0351...(UNIX準拠としてファイルにエスケープシーケンスをecho実装がそう、すべてではないが)、その後、あなたはむしろ使用したいprintfの代わりに:

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

反対にecho、そのファイルは移植性があり、ファイルのコンテンツがで始まっていても問題はありません-。


する代わりに$(cat file)、とksh、zshとbash、1にも行うことができます$(<file)。これは、シェルcatがファイルの内容を読み取って展開を構成する特別な演算子です。を除き、NULバイトの末尾の改行とチョークを削除しますzsh。ではbash、まだ追加のプロセスがフォークされています。また、1つの違いは、ディレクトリタイプのファイルをそのように読み取ろうとしてもエラーが発生しないことです。また、while $(< file)は特別です$(< file; other command)が、(zsh他のシェルをエミュレートしない場合file、暗黙的な $READNULLCMDコマンド(通常はページャー)を実行することにより、のコンテンツを展開します)ではありません。


3
bashとzshの両方で、catをスキップして、シェルに直接読み込ませることができますecho "$(<my_file.txt)"。
— ケビン

1
はい、ksh、zsh、およびbashで使用できます$(<filename)。
— ディミトレラドゥロフ

どうもありがとう、それが私が必要とするものであり、うまくいきました!:-)
— danielmbcn

@ Kevin、Dimitreが追加されました。
— ステファンシャゼラス

4

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

echo $(<my_file.txt)

または

echo `<my_file.txt`

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


2

簡単な答え:できません。echo(シェル組み込みまたは通常のバイナリ)は、その標準入力を処理しません-それは一方向のみです。


質問は、なぜあなたは実際にこれをしたいのですか?
— ペテルフ

2

言われたように、

echoファイルのコンテンツを表示したい場合は、そのコンテンツを引数として渡す必要がありますecho

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

$ cat my_file.txt | xargs echo -e

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

$ cat my_file.txt | xargs echo

ただし、使用する場合xargs echo(デフォルトのコマンドであるxargsbtw と同じecho)、echo実行されるのはファイルシステムからのコマンドであり、シェルの組み込みechoコマンドではありません。またxargs、入力は非常に特殊な形式であることに注意してください(空白、改行、引用符、バックスラッシュには特別な意味があります)。cat同じCONCATENATEに一つだけのファイル(存在だとして、ここであまり意味がありません< file.txt xargs echo。Unixの対応のことに注意してくださいechosがデフォルトして出力することにより、バックスラッシュエスケープ拡張を行う-e時echo -e。
— ステファンChazelas

0

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

echo `cat my_file.txt`

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


確かに、バックティックはのように機能し$( . . . )ます。$()あなたがそれらをネストできるので、使用する人々は通常それらを好む。この質問は古いですが、まだ答えられていない質問に答える方がはるかに満足です!
— 法律

そうでもない。微妙な違いがあります。バックティック形式が使用される場合、バックスラッシュは、$、 `、または\が続く場合を除き、リテラルの意味を保持します。バックスラッシュが前にない最初のバックティックは、コマンドを終了します。$(,,,)形式を使用する場合、括弧で囲まれたすべての文字がコマンドを構成します。
— fpmurphy

このコマンド置換は引用符で囲まれていないため、split + glob演算子が適用されます。たとえば、my_file.txtが含まれている場合*、現在のディレクトリ内のファイル名のリストが出力されます。
— ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.