web-dev-qa-db-ja.com

<(左山形/三角括弧)は何をしますか?

>は、プログラムのSTDOUTをファイルにリダイレクトするためのものであると理解しています。echo 'polo' > marco.txtは、marco.txtというテキストファイルをpoloで作成します。端末出力に書き込む代わりに内容として。また、それと|(パイプ)の違いも理解しています。これは、STDOUTをパイプの左側の最初のコマンドからパイプの右側の2番目のコマンドのSTDINにリダイレクトするために使用されます。 echo 'Hello world' | lesslessビューにHello worldを表示します。

<の仕組みが本当にわかりません。 marco.txt < echo 'polo'を試してみたところ、bashからエラーが発生しました:-bash: echo: No such file or directory。誰かがそれがどのように機能するか、なぜ私がそれを使うのか説明できますか?

21
jsejcksn

演算子<は、ファイルのコンテンツをリダイレクトするために最もよく使用されます。例えば

grep "something" < /path/to/input.file > /path/to/output.file 

これにより、input.fileの内容がgrepさ​​れ、「something」を含む行がoutput.fileに出力されます。

>演算子の完全な「逆」演算子ではありませんが、ファイルに関しては限定的な意味があります。

<の他のアプリケーションと一緒に、本当によくて簡単な説明については、 io redirection を参照してください

更新:ここのコメントで質問に答えるには、<演算子を使用してbashでファイル記述子を操作する方法を示します。

Stdin(0)、stdout(1)、およびstderr(2)以外の追加の入力または出力をbash環境に追加できます。これは、出力をリダイレクトする場所を常に切り替えるよりも便利な場合があります。 bashの3つの「std」入力/出力の隣の()内の#は、それらの「ファイル記述子」ですが、bashではそのように参照されることはほとんどありません-Cではより頻繁に使用されますが、それでも定数が定義されていますこれらの数値から離れたものを抽象化します。例えばSTDOUT_FILENOはunistd.hまたはstdlib.hで1として定義されています...

ユーザーの端末とのインターフェースにすでにstdinとstdoutを使用しているスクリプトがあるとします。その後、stdin/stdoutストリームに影響を与えることなく、読み取り、書き込み、またはその両方のために追加のファイルを開くことができます。これが簡単な例です。基本的に、上記のtldp.orgリンクにあるのと同じタイプの資料。

#!/bin/bash -
#open a file for reading, assign it FD 3
exec 3</path/to/input.file
#open another file for writing, assign it FD 4
exec 4>/path/to/output.file
#and a third, for reading and writing, with FD 6 (it's not recommended to use FD 5)
exec 6<>/path/to/inputoutput.file

#Now we can read stuff in from 3 places - FD 0 - stdin; FD 3; input.file and FD 6, inputoutput.file
# and write to 4 streams - stdout, FD 1, stderr, FD 2, output.file, FD 4 and inputoutput.file, FD 6

# search for "something" in file 3 and put the number found in file 4
grep -c "something" <&3 >&4

# count the number of times "thisword" is in file 6, and append that number to file 6
grep -c "thisword" <&6 >>&6

# redirect stderr to file 3 for rest of script
exec 2>>&3

#close the files
3<&-
4<&-
6<&-
# also - there was no use of cat in this example. I'm now a UUOC convert.

私はそれが今もっと理にかなっていると思います-沈むためには実際に少し遊んでいなければなりません。 POSIXのマントラを覚えておいてください-すべてがファイルです。したがって、<は実際にはファイルにのみ適用可能であると人々が言うとき、それはLinux/Unixの問題を制限するものではありません。何かがファイルでない場合は、簡単に見た目を変えてファイルのように動作させることができます。

18
Argonauts

<の後のファイルを<の前のプログラムのstdinにリダイレクトします。

foo < bar

ファイルfooをstdinとして使用して、プログラムbarを実行します。

4
v7d8dpo4