「猫の無用な使用」について聞いていくつかの提案を見つけましたが、以下は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 コマンドの前でも使用できます。ただし、コマンドの前では機能しません。
小なり記号(<
)は、ファイルを開いて、いくつかのアプリケーション/プログラムの標準入力デバイスハンドルに添付しています。しかし、入力をアタッチするアプリケーションをシェルに指定していません。
これら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
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}'
UUOCは次の場所にあります。
cat somefile | some-cmd
または
cat < somefile | some-cmd
そこ、 some-cmd
は、somefile
からそれを読み取るcat
によって供給されるパイプからsomefile
の内容を読み取っています。
some-cmd
は、somefile
から直接読み取ることができます(シェルが標準入力でオープンした後)。cat
は必要ありません。
some-cmd < somefile
または
< somefile some-cmd
(リダイレクトは、単純なコマンドラインのどこにでも表示できます)。