my_file.txt
内容が文字列のファイルがありますHello
。その内容をコマンドにリダイレクトするにはどうすればよいですかecho
?
私はそのコマンドを持っていることを知っていますが、less
それを実行するにはそのコマンドを使用する必要があります。cat
more
echo
私はこれを試しました:
$ 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一貫性実装と同様に、\0351
echo
しかし、すべてではありません)、その後printf
むしろ使用しますか?:
printf '%b\n' "$(cat my_file.txt)"
対照的にecho
、ファイルの内容が-
。
代わり$(cat file)
にksh
、zsh
およびを使用してbash
次のこともできます。$(<file)
。これは特殊演算子です。シェルcat
拡張を補うためにファイルの内容を読むのとは対照的です。それでも追加のプロセスを作成することを除いて、末尾の改行を削除してNULバイトをブロックしますzsh
。bash
また、1つの違いは、この方法でディレクトリタイプファイルを読み取ろうとするとエラーが発生しないことです。また、$(< file)
特別ですが(他のシェルをエミュレートしない場合は、以下を実行して拡張されるわけでは$(< file; other command)
ありません)zsh
file
絶対的な $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.txt
STDOUTで生成されますが、シェルがそれを処理する方法は<
変わります。my_file.txt
これでmy_file.txt
、シェルはコンテンツを引数として渡すのではなく、STDINにコンテンツを配置します。前に見たように、標準入力から読み取らないので何も印刷しません。echo
./my_file.txt
echo
echo
STDINから本当に読むには、次のものを使用する必要がecho
あります。xargs
xargs echo < my_file.txt
<
パラメーターではなく、my_file.txt
内容がSTDINに配置されたファイルへのパス。xargs
echo
STDIN()から読み取られた引数を使用して、指定されたコマンドを実行します。
これで「Hello」が印刷されます。
同様に、
cat my_file.txt | xargs echo
また利用できます:
cat
コンテンツをインポートし、./my_file.txt
STDINに挿入し、STDOUTにコンテンツを印刷します。- パイプは
|
STDOUTを取得し、端末にこのSTDOUTを印刷する代わりにcat
STDINに入れます(デフォルトの動作)。echo
xargs
echo
STDIN()から読み取られた引数を使用して、指定されたコマンドを実行します。