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

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

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

私はそのコマンドを持っていることを知っていますが、lessそれを実行するにはそのコマンドを使用する必要があります。catmoreecho

私はこれを試しました:

$ cat my_file.txt | echo

これ:

$ echo < my_file.txt

ただし、どちらの場合も、標準出力では空白としてのみ表示され、my_file.txtの内容は表示されません。

どうすればいいですか?

答え1

必要なものをすべてリダイレクトできますが、 echo何もしません。echo標準入力を読みません。標準出力に書き込むのがすべてです。議論空白文字で区切られ、改行文字で終了します(そして、いくつかの実装echoでは、拡張されたエスケープシーケンスが提供または-オプションとして扱われる引数で始まります)。

echoファイルの内容を表示するには、その内容をecho次のパラメーターに渡す必要があります。

echo "$(cat my_file.txt)"

末尾$(...)の改行文字は削除されます。Sこのコマンドの出力からcat追加echo一つ退いてください。

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

これを行う理由がechoファイル内で\n、、...エスケープシーケンスを拡張するためである場合\b(UNIX一貫性実装と同様に、\0351echoしかし、すべてではありません)、その後printfむしろ使用しますか?:

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

対照的にecho、ファイルの内容が-


代わり$(cat file)kshzshおよびを使用してbash次のこともできます。$(<file)。これは特殊演算子です。シェルcat拡張を補うためにファイルの内容を読むのとは対照的です。それでも追加のプロセスを作成することを除いて、末尾の改行を削除してNULバイトをブロックしますzshbashまた、1つの違いは、この方法でディレクトリタイプファイルを読み取ろうとするとエラーが発生しないことです。また、$(< file)特別ですが(他のシェルをエミュレートしない場合は、以下を実行して拡張されるわけでは$(< file; other command)ありません)zshfile絶対的な $READNULLCMDコマンド(通常ポケットベル))。

答え2

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

echo "$(<my_file.txt)"

または

echo "`<my_file.txt`"

$(...)`...`同じことを行います。コマンドの置き換えです。これはその範囲内でコマンドを実行し、ユーザーが入力として提供したように出力をシェルに提供します。 2つの間の唯一の違いは、単純に入れ子にする$(...)ことができ、入れ子に`...`するにはエスケープする必要があることです。

コマンド置換の引用符はスペースを保持します。

答え3

言ったように、

echoファイルの内容を表示するには、その内容をパラメータとして渡す必要があります。echo

たとえば、次のようにできますxargs(有効にする必要があることを考慮)。バックスラッシュエスケープ):

$ cat my_file.txt | xargs echo -e

または、ただ質問した内容(説明なし)エスケープシーケンス):

$ cat my_file.txt | xargs echo

答え4

リダイレクトに関して、Linuxコマンドは渡された引数を異なる方法で解釈し、結果として異なる動作が発生する可能性があることに注意することが重要です。重要な部分は理解することです。

  • いくつかのコマンドはファイルパスを必要とし、ファイルの内容をSTDINに入れます。その後、そのコマンドはそれを読み取り、処理し、出力を生成します。たとえば、これを試してみcatてください。
  • 他のコマンドはSTDINに何も入れず、そこからは読みません。つまり、STDINは単に無視されます。代わりに、パラメータを直接読み込み、出力を生成します。

したがって、一部のコマンドはSTDINの内容に完全に依存している可能性がありますが、他のコマンドはSTDINの内容には気を付けません。これはリダイレクトにとって重要です。これは、STDOUTを無視するコマンドのSTDINにリダイレクトすると、目的の動作が得られないためです。

走れば

cat

まるでぶら下がって何かを待っているようですcat。これは、STDINに何も渡さないと、デフォルトで標準入力がキーボードに接続されるために発生します。つまり、cat何でも入力するのを待ってEnterキーを押して送信します。

一方、

echo

このコマンドはSTDINで読み取られませんので、そのままにしてください。パラメータがないため、印刷する内容はありません。

だから入力すると

echo < my_file.txt

通常、echoこれはmy_file.txtパラメータとして扱われ、単にmy_file.txtSTDOUTで生成されますが、シェルがそれを処理する方法は<変わります。my_file.txtこれでmy_file.txt、シェルはコンテンツを引数として渡すのではなく、STDINにコンテンツを配置します。前に見たように、標準入力から読み取らないので何も印刷しません。echo./my_file.txtechoecho

STDINから本当に読むには、次のものを使用する必要がechoあります。xargs

xargs echo < my_file.txt
  • <パラメーターではなく、my_file.txt内容がSTDINに配置されたファイルへのパス。
  • xargsechoSTDIN()から読み取られた引数を使用して、指定されたコマンドを実行します。

これで「Hello」が印刷されます。

同様に、

cat my_file.txt | xargs echo

また利用できます:

  • catコンテンツをインポートし、./my_file.txtSTDINに挿入し、STDOUTにコンテンツを印刷します。
  • パイプは|STDOUTを取得し、端末にこのSTDOUTを印刷する代わりにcatSTDINに入れます(デフォルトの動作)。echo
  • xargsechoSTDIN()から読み取られた引数を使用して、指定されたコマンドを実行します。

関連情報