ファイル出力とコマンド出力をどのように区別しますか?

ファイル出力とコマンド出力をどのように区別しますか?

通常、次のように書く。

diff file1 file2

しかし、ファイルをコマンドの出力と比較したいです(ここではコマンドを簡単にします)。

diff file1 <(cat file2 | sort)

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

だから質問は – これを正しく行う方法は?

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

答え1

あなたのスクリプトとシェルが異なるようです。たぶん#!/bin/shスクリプトの上部にインタプリタとして持っていますが、bashプライベートシェルとして使用しているかもしれません。を実行して、端末で実行されているシェルを確認できますecho $SHELL

これを行うより簡単な方法(ほとんどのシェルで動作します)は、指定したファイル読み取り演算子の代わりにパイプリダイレクトを使用することです。 「-」記号はSTDINを読み取る標準命名法であり、パラメータリストのファイル名を置き換えるためによく使用されます。

cat file2 | sort | diff file1 -

または避けるために猫の無駄な使用:

sort < file2 | diff file1 -

答え2

標準入力の範囲はスクリプト自体なので、次のようにコードをブロックに入れます。

{
  diff file1 <(sort file2)
}

これにより、STDINの範囲がブロック内にあります。

私はそれを試してみました。

関連情報