如何区分文件并从命令输出?


32

通常您会写:

diff file1 file2

但是我想比较一个文件并从命令中输出(这里我使命令变得微不足道):

diff file1 <(cat file2 | sort)

好的,当我在shell提示符下手动输入此命令时,此工作有效,但是当我在shell脚本中放入完全相同的行,然后运行该脚本时,出现错误。

因此,问题是-如何正确执行此操作?

当然,我想避免将输出写入临时文件。

Answers:


39

我怀疑您的脚本和外壳程序不同。也许您#!/bin/sh最先将脚本作为解释器,但您正在将其bash用作个人外壳。您可以通过运行找出在终端中运行的shell echo $SHELL

可以在大多数Shell上使用的更简单的方法是使用管道重定向,而不是您提供的文件读取运算符。符号“-”是用于读取STDIN的标准命名法,通常可以用来代替参数列表中的文件名:

cat file2 | sort | diff file1 -

或避免无用的使用猫

sort < file2 | diff file1 -

啊,你很好,的确,我没有检查sh是否是bash。非常感谢您的解决方案。
greenoldman

它与标准输出差异文件。现在如何与文件比较标准输出?我的意思是相反的方向。这是-R在使用的情况下git diff --no-index
Nakilon

@Nakilon您只需更改参数顺序:diff - file1
加勒布

凉。这不适用于git diff
Nakilon

@Nakilon当然不是,为什么呢?git diff是完全不同的野兽,并且在其内部索引(而非文件)中引用对glob对象的引用;diff在文件系统上运行。该-语法只是外壳句法糖/dev/stdin,较标准输入流的文件。因此,为什么diff可以用它代替文件名。同时git diff,它不是在查找文件,而是在查找对象,因此您必须将其可以识别的内容传递给它。不要使用它来相互比较文件,请使用diff它。
加勒布

-4

标准输入的范围是脚本本身,因此只需将您的代码放入如下代码块中:

{
  diff file1 <(sort file2)
}

这样,STDIN的作用域就位于块内。

我已经尝试过并且有效。


那不是一个函数,它是一个块,并且没有任何区别。
吉尔斯(Gilles)'所以

@gilles Thx进行更正。顺便说一句,我已经尝试过了,而且效果很好。你是否?
tmow 2011年

3
该块对<(…)构造的有效性没有任何影响。您的脚本是否有效取决于您是否在支持该脚本的shell中运行该脚本<(…)(ksh93 / bash / zsh与Bourne / ash / kshk88)。卡勒布(Caleb)的回答将这一切都钉住了。
吉尔(Gilles)“所以,别再邪恶了”,

1
@gilles好的,谢谢解释。
tmow 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.