ファイルとコマンドからの出力を比較する方法は?


32

通常、次のように記述します。

diff file1 file2

しかし、私はファイルとコマンドからの出力を比較したいと思います(ここではコマンドを些細なものにします):

diff file1 <(cat file2 | sort)

OK、これはシェルプロンプトでこれを手動で入力すると動作しますが、シェルスクリプトにまったく同じ行を入力してからスクリプトを実行するとエラーが発生します。

だから、問題は-これを正しく行う方法ですか?

もちろん、出力を一時ファイルに書き込むことは避けたいです。

回答:


39

あなたのスクリプトとあなたのシェルは異なっていると思います。おそらく#!/bin/sh、スクリプトの先頭にインタープリターがいるのにbash、個人的なシェルとして使用している可能性があります。を実行すると、ターミナルで実行しているシェルを確認できますecho $SHELL

ほとんどのシェルで動作するはずのこれを行う簡単な方法は、指定したファイル読み取り演算子の代わりにパイプリダイレクトを使用することです。記号「-」は、STDINを読み取るための標準的な命名法であり、引数リスト内のファイル名の置換として頻繁に使用できます。

cat file2 | sort | diff file1 -

または、catの無駄な使用を避けるために:

sort < file2 | diff file1 -

ああ、あなたは良いです、確かに、shがbashかどうかはチェックしませんでした。解決策をありがとうございます。
greenoldman

stdoutでファイルを比較しています。さて、標準出力をファイルと比較する方法は?つまり、反対方向です。それ-Rを使用する場合git diff --no-index
ナキロン

@Nakilonあなただけの引数の順序を変更しますdiff - file1
カレブ

クール。これは機能しませんでしたgit diff
ナキロン

@Nakilonもちろん、そうではないのはなぜですか?git diff完全に異なる獣であり、ファイルではなく、内部インデックス内のglobオブジェクトへの参照で動作します。diffファイルシステム上で動作します。-構文はただのための糖衣構文のシェルです/dev/stdinSTDINストリームを表すファイルを、。したがってdiff、ファイル名の代わりとして使用できる理由。一方git diff、ファイルを検索するのではなく、オブジェクトを検索するため、認識できるものを渡す必要があります。ファイルを相互に比較するために使用しないでくださいdiff。そのために使用してください。
カレブ

-4

標準入力のスコープはスクリプトそのものなので、次のようにブロックの中にコードを入れてください。

{
  diff file1 <(sort file2)
}

このように、STDINのスコープはブロック内にあります。

私は試しましたが、それは動作します。


それは関数ではなく、ブロックであり、違いはありません。
ジル「SO-悪であるのをやめる」

@gilles Thxによる修正。ところで私は自分で試してみましたが、うまくいきます。しましたか?
tmow

3
ブロックは、<(…)構造の有効性に影響を与えません。スクリプトは、サポートするシェル<(…)(ksh93 / bash / zsh対Bourne / ash / kshk88)で実行するかどうかに応じて、機能するか機能しないかが決まります。カレブの答えはすべてを釘付けにします。
ジル「SO-悪であるのをやめる」

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