「cat」と「cat <」の違い


70

私はチュートリアルを進めていて、両方cat myfile.txtとの使用を見ましたcat < myfile.txt。これら2つのコマンドシーケンスに違いはありますか?どちらもファイルの内容をシェルに出力するようです。


回答:


106

前者の場合catはファイルを開き、後者の場合はシェルがファイルを開き、それをcatの標準入力として渡します。

技術的には、異なる効果があります。たとえば、catプログラムよりも高い(または低い)特権を持つシェル実装を使用することができます。そのシナリオでは、一方がファイルを開けない場合と、もう一方がファイルを開けない場合があります。

それは通常のシナリオではありませんが、シェルとcat同じプログラムではないことを指摘するために言及しました。


83
はい、たとえばできますsudo cat myfile.txt。ただしsudo cat < myfile.txt、ファイルを読み取る権限がない場合は機能しません。
zuazo

2
組み込み機能があることに注意しksh93てください(ただし、初期段階ではcatない限り、デフォルトでは有効になっていません)。/opt/ast/bin$PATH
ステファンシャゼラス16

2
一部のプログラムは、ファイル名引数を受け取るか標準入力を受け取るかによって動作が異なります。たとえばwc、引数を指定すると、カウントの前にファイル名を出力します。
バーマー

21

テストケースに目に見える大きな違いはありません。最も明らかなの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の権限を上げると、動作に大きな違いが生じます。


5
好奇心から、あなたは本当にkshあなた自身の意志の使用を使用します

1
@cat-その質問は明らかに無知に基づいています。自分構築して確認してください。
mikeserv

2
真剣に失礼ではない、軽薄な、しかし十分に公平であることを意図していた@mikeservは、私は考えます

2
@cat-そうでないとは思わなかった。無知は恥ずべきことではありません-それは知識の不足です。誰かがksh93の使用を選択する理由を理解していない場合、それを使用したことがないためだと推測できます。そうすることをお勧めします。確かに試してみる価値があります。そして、私があなたに言うとき、私と信じて、それは、と比較してbashksh93はるかに良いシェルです。それはだ、ほとんど、シェル。
mikeserv

5
@mikeservが他の場所で指摘したように、読み取り不能または存在しない場合とはcat < file1 > file2非常に異なる効果cat file1 > file2file1あります。(後者の形式は切り捨てられfile2、前者は切り捨てられません。)
ワイルドカード

7

cat myfile.txtファイルを読み取り、myfile.txt標準出力に出力します。

cat < myfile.txtここでcatは、開くファイルが指定されていないため、多くのUnixコマンドfile.txtと同様に、シェルから送信される標準入力からデータを読み取り、標準出力に出力します。


6

@Thomas Dickeyの答えは素晴らしい。

いくつかのファイルを読み取る場合についてのいくつかの明白な事実を追加したいだけです(あなたの質問に大まかに関連していますが、それでも):

  • cat <file1 <file2 <file3少なくともbashではfile3のみを読み取ります。(実際には、シェルによって異なりますが、ほとんどのシェルはなりDUP効果への最後の1を引き起こし標準入力へのすべての指定されたファイルを、。)
  • cat file1 file2 file3指定されたすべてのファイルを順番に読み取ります(実際、catconcatenateという単語の短縮形です)。
  • 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によって実際に使用されないリダイレクトでも発生します)。どちらの場合も、誤った終了コードが返されます。


1
ただし、最初の例でcatfile1and が開き、3番目の例とfile2同じです。のみ、それぞれ表示されます。これらの以前のオープン命令が成功した場合の内容。file4file5file3file6
jlliagre 16

@jlliagre、ありがとう、私はそれを知りませんでした。Straceは明らかにあなたの正しさを証明しました。ケース1および3aの括弧付きのテキストを修正しました。
サーシャ

0

別のコマンドを使用して、次の違いを確認できます。

wc –w food2.txt

可能な出力:

6 food2.txt

コマンドはそれを知っているのでファイル名を伝えます(引数として渡されます)。

wc –w < food2.txt

可能な出力:

6

標準入力は、コマンドが認識せずにファイルfood2.txtにリダイレクトされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.