web-dev-qa-db-ja.com

小なり記号がbashの猫の代わりとして機能しないのはなぜですか?

「猫の無用な使用」について聞いていくつかの提案を見つけましたが、以下はbashシェルに何も出力しません。

< filename

猫を使用しても期待どおりに動作します。

cat filename

私はFedora Core 18とGNU bash、バージョン4.2.45(1)を使用しています。

編集:パイプの前でそれを使用しても機能しません。

< filename | grep pattern

猫を使用すると期待どおりに動作するのに対し。

cat filename | grep pattern

EDIT2:明確にするために、私はこれを使用できることを知っています

grep pattern < filename

しかし、私はここを読みます https://stackoverflow.com/questions/11710552/useless-use-of-cat コマンドの前でも使用できます。ただし、コマンドの前では機能しません。

19
bug

小なり記号(<)は、ファイルを開いて、いくつかのアプリケーション/プログラムの標準入力デバイスハンドルに添付しています。しかし、入力をアタッチするアプリケーションをシェルに指定していません。

これら2つの例は基本的に同じことを行いますが、2つのわずかに異なる方法で入力を取得します。

ファイルを開く

$ cat blah.txt 
hi

STDINを開く

$ cat < blah.txt 
hi

カーテンの後ろを覗く

straceを使用して、何が起こっているかを確認できます。

ファイルから読み取る場合

open("blah.txt", O_RDONLY)              = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=3, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0

STDINから読み取った場合(0として識別)

read(0, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(0, "", 65536)                      = 0
close(0)                                = 0
close(1)                                = 0

最初の例では、catがファイルを開いて読み取ったことがわかりますblah.txt。 2番目では、catがファイルの内容を読み取ることがわかりますblah.txt STDINファイル記述子を介して、記述子番号0として識別されます。

read(0, "hi\n", 65536)                  = 3
24
slm

catの従来の役に立たない使用法は、ファイルを直接開くことができるプログラムに入力を与えるために使用する場合です。例えば:

悪い

cat file | grep foo
cat file | while read line; do echo "$line"; done
cat file | sed 's/a/b/'
cat file | awk '{print $1}'

良い

grep foo file
while read line; do echo "$line"; done < file 
sed 's/a/b/' file
awk '{print $1}' file

また良い(<fileはコマンドのどちら側にも置くことができます)

<file grep foo
 sed 's/a/b/' < file
<file awk '{print $1}' 
15
terdon

UUOCは次の場所にあります。

cat somefile | some-cmd

または

cat < somefile | some-cmd

そこ、 some-cmdは、somefileからそれを読み取るcatによって供給されるパイプからsomefileの内容を読み取っています。

some-cmdは、somefileから直接読み取ることができます(シェルが標準入力でオープンした後)。catは必要ありません。

some-cmd < somefile

または

< somefile some-cmd

(リダイレクトは、単純なコマンドラインのどこにでも表示できます)。

13