回答:
前者の場合cat
はファイルを開き、後者の場合はシェルがファイルを開き、それをcat
の標準入力として渡します。
技術的には、異なる効果があります。たとえば、cat
プログラムよりも高い(または低い)特権を持つシェル実装を使用することができます。そのシナリオでは、一方がファイルを開けない場合と、もう一方がファイルを開けない場合があります。
それは通常のシナリオではありませんが、シェルとcat
同じプログラムではないことを指摘するために言及しました。
sudo cat myfile.txt
。ただしsudo cat < myfile.txt
、ファイルを読み取る権限がない場合は機能しません。
ksh93
てください(ただし、初期段階ではcat
ない限り、デフォルトでは有効になっていません)。/opt/ast/bin
$PATH
wc
、引数を指定すると、カウントの前にファイル名を出力します。
テストケースに目に見える大きな違いはありません。最も明らかなのmyfile.txt
は、現在のディレクトリに名前の付いたファイルがない場合、または読み取りが許可されていない場合に表示されるエラーメッセージです。
前者の場合、cat
文句を言い、後者の場合、シェルは、前者のプロセスと後者のシェルのどちらのプロセスがファイルを開こうとしているのかを明確に示しますcat
。
$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]
より一般的な場合、大きな違いは、リダイレクトを使用して複数のファイルのコンテンツを印刷できないことです。これは、コマンドの本来の目的cat
(つまり、cat enate)です。とにかくシェルはリダイレクトされた入力として渡されたすべてのファイルを開こうとしますが、実際に最後のファイルcat
を使用するのはzsh
、そのmultios
「zshism」を使用しない場合のみです。
$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and
# displays an error message, cat gets nothing on stdin
# so shows nothing
ksh93: two: cannot open [No such file or directory]
標準システムでは、シェルとcat
ファイルアクセス権に違いはないため、どちらも同じように成功または失敗します。トーマス・ディッキーの返信と添付のコメントがすでに示唆しているように、を使用sudo
してcat
の権限を上げると、動作に大きな違いが生じます。
ksh
あなた自身の意志の使用を使用しますか?
bash
、ksh93
はるかに良いシェルです。それはだ、ほとんど、シェル。
@Thomas Dickeyの答えは素晴らしい。
いくつかのファイルを読み取る場合についてのいくつかの明白な事実を追加したいだけです(あなたの質問に大まかに関連していますが、それでも):
cat <file1 <file2 <file3
少なくともbashではfile3のみを読み取ります。(実際には、シェルによって異なりますが、ほとんどのシェルはなりDUP効果への最後の1を引き起こし標準入力へのすべての指定されたファイルを、。)cat file1 file2 file3
指定されたすべてのファイルを順番に読み取ります(実際、catはconcatenateという単語の短縮形です)。cat file1 file2 file3 <file4 <file5 <file6
file1、file2、file3のみを読み取ります(ファイル名の引数が渡されると、catはstdinを無視するため)。
cat file1 file2 - file3 <file4 <file5 <file6
file1、file2、file6、file3を読み取ります(ハイフンがcatにstdinを無視させないようにするため)。そしてエラーについて。引数として指定されたいくつかのファイルを開くことができない場合(なし<
)、catは失敗したファイルをスキップし(関連するメッセージをstderrに出力します)、他のファイルを読み取ります。(withで<
)リダイレクトとして指定されたファイルの少なくとも1つを開くことができない場合、シェルはcatを開始しません(catによって実際に使用されないリダイレクトでも発生します)。どちらの場合も、誤った終了コードが返されます。
cat
はfile1
and が開き、3番目の例とfile2
同じです。のみ、それぞれ表示されます。これらの以前のオープン命令が成功した場合の内容。file4
file5
file3
file6
別のコマンドを使用して、次の違いを確認できます。
wc –w food2.txt
。
可能な出力:
6 food2.txt
。
コマンドはそれを知っているのでファイル名を伝えます(引数として渡されます)。
wc –w < food2.txt
。
可能な出力:
6
。
標準入力は、コマンドが認識せずにファイルfood2.txtにリダイレクトされます。