如何在Bash脚本中显示两个文件的差异?

如何在Bash脚本中显示两个文件的差异?,bash,diff,Bash,Diff,我试图比较bash脚本中两个文件的内容 local_file=$(cat my_local_file.txt) remote_file=$(curl -s "http://example.com/remote-file.txt") if [ local_file == remote_file ]; then echo "Files are the same" else echo "Files are different. Here is the diff:" diff <(e

我试图比较bash脚本中两个文件的内容

local_file=$(cat my_local_file.txt)
remote_file=$(curl -s "http://example.com/remote-file.txt")

if [ local_file == remote_file ]; then
  echo "Files are the same"
else
  echo "Files are different. Here is the diff:"
  diff <(echo "$local_file") <(echo "$remote_file")
fi
local\u file=$(cat my\u local\u file.txt)
远程_文件=$(curl-s)http://example.com/remote-file.txt")
如果[本地_文件==远程_文件];然后
echo“文件相同”
其他的
“echo”文件不同。以下是区别:
diff是一种bash特性,通常在与POSIX兼容的
/bin/sh
中不可用

如果要将脚本作为可执行文件运行,请确保使用以下shebang行:

#!/bin/bash
而不是

#!/bin/sh
sh script.sh
或使用

bash script.sh
而不是

#!/bin/sh
sh script.sh
如果你那样运行它


要使脚本与POSIX兼容shell一起工作,我只需下载该文件并将其与本地文件进行比较。在diff.

是bash功能之后删除下载的文件,该功能通常在与POSIX兼容的
/bin/sh
中不可用

如果要将脚本作为可执行文件运行,请确保使用以下shebang行:

#!/bin/bash
而不是

#!/bin/sh
sh script.sh
或使用

bash script.sh
而不是

#!/bin/sh
sh script.sh
如果你那样运行它



要使脚本与POSIX兼容shell一起工作,我只需下载该文件并将其与本地文件进行比较。删除差异后下载的文件。

您还可以使用以下命令:

cmp -b "File_1.txt" "File_2.txt"

也可以使用以下命令:

cmp -b "File_1.txt" "File_2.txt"


除了
之外,
进程替换在bash中甚至不可用,如果它以“sh”的名称运行;因此,您必须显式地使用“bash”而不是“sh”(最好通过shebang,但是使用
bash scriptname
运行脚本也可以);因此,您必须显式地使用“bash”而不是“sh”(最好是通过shebang,但使用
bash scriptname
运行脚本也可以)。最好在本地下载文件,而不是将其保存在bash的内存中。特别是
$(…)
,因此
本地_文件
远程_文件
的内容可能无法反映磁盘上的内容。@dimo414
diff
是否处理NUL字符?我怀疑不是。“Barmar,我不能普遍地说,因为有不同的实现,但是我会考虑任何不能破解的<代码>差异代码>代码>程序。GNU diff确实可以处理NUL字符,请尝试
diff@dimo414。我认为POSIX不需要处理文本文件的实用程序来处理嵌入的NUL字符。许多GNU实用程序试图超出要求,但这不是我通常期望的。@Barmar我不确定这是否是规范源代码,但它看起来(请参阅“Diff Binary Output Format”)明确支持二进制文件。最好在本地下载该文件,而不是将其保存在Bash的内存中。特别是
$(…)
,因此
本地_文件
远程_文件
的内容可能无法反映磁盘上的内容。@dimo414
diff
是否处理NUL字符?我怀疑不是。“Barmar,我不能普遍地说,因为有不同的实现,但是我会考虑任何不能破解的<代码>差异代码>代码>程序。GNU diff确实可以处理NUL字符,请尝试
diff@dimo414。我认为POSIX不需要处理文本文件的实用程序来处理嵌入的NUL字符。许多GNU实用程序试图超出要求,但这不是我通常期望的。@Barmar我不确定这是否是规范源,但它看起来(请参阅“Diff Binary Output Format”)明确支持二进制文件。Diff的返回值告诉您输入是否匹配,因此您可以不用cmp调用。像这样的东西应该会起作用,而且会稍微快一点
local\u file=my\u local\u file.txt curl-s”http://example.com/remote-file.txt“-o远程_文件输出=$(差异--“$local_文件”“$remote_文件”)如果[$?];“echo”文件是相同的,“else echo”文件是不同的。这是您的初始描述和代码中的区别:“echo”$OUTPUT”fi
,如果[“$a”=“$b”];然后
还会比较字符串吗?curl将下载到名为
remote\u file
的文件中,因此如果cmp-s--“$local\u file”“remote\u file”,那么cmp行应该是
;然后
谢谢@RyanPrescott。更新了答案。diff的返回值会告诉您输入是否匹配,因此您可以在没有cmp调用的情况下通过。像这样的东西应该会起作用,而且会稍微快一点
local\u file=my\u local\u file.txt curl-s”http://example.com/remote-file.txt“-o远程_文件输出=$(差异--“$local_文件”“$remote_文件”)如果[$?];“echo”文件是相同的,“else echo”文件是不同的。这是您的初始描述和代码中的区别:“echo”$OUTPUT”fi
,如果[“$a”=“$b”];然后
还会比较字符串吗?curl将下载到名为
remote\u file
的文件中,因此如果cmp-s--“$local\u file”“remote\u file”,那么cmp行应该是
;然后
谢谢@RyanPrescott。更新了答案。当文件数据位于变量中时,这有何帮助?当文件数据位于变量中时,这有何帮助?