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
コマンド(通常はポケットベル)を実行します)。
他の回答に加えて、cat
の代わりに入力リダイレクトを試すこともできます
_echo $(<my_file.txt)
_
または
_echo `<my_file.txt`
_
$()
と ``は同じことを実行します。スコープ内でコマンドを実行し、ユーザーが入力として指定したかのようにシェルに出力を提供します。これら2つの違いは、$()が再帰的であり、 ``が再帰的ではないことです。
言われたように、
echo
でファイルのコンテンツを表示するには、そのコンテンツを引数としてecho
に渡す必要があります。
たとえば、xargs
を使用して次のように実行できます(バックスラッシュエスケープの解釈を有効にする必要があることを考慮してください)。
$ cat my_file.txt | xargs echo -e
または単にあなたが尋ねたもの(エスケープシーケンスの解釈なし):
$ cat my_file.txt | xargs echo
簡単な答え:できません。 echo
(Shellビルトインまたは通常のバイナリ)は、標準入力を処理しません-片道のみです。
Bashでは、以下も機能するはずです。
echo `cat my_file.txt`
バックティックで囲まれた部分は、そのコマンドの出力に置き換えられます。つまり、この場合、ファイルの内容に置き換えられます。