如何在 bash 中忽略 diff 的输出
How to ignore output of diff in bash
我尝试比较两个文件并输出自定义字符串。以下是我的脚本。
#!/bin/bash
./ > tmp
if ! diff -q tmp ans.txt &>/dev/null; then
>&2 echo "different"
else
>&2 echo "same"
fi
当我执行脚本时,我得到:
sh cmp.sh ans.txt
different
Files tmp and ans.txt differ
奇怪的部分是当我输入 diff -q tmp ans.txt &>/dev/null
时。不会显示任何输出。
如何修复(我不想要行:“文件 tmp 和 ans.txt 不同”)?谢谢!
很可能您使用的 sh
版本不理解同时重定向 stdout 和 stderr 的 bash (deprecated/obsolete) 扩展 &>
时间。在 posix shell 中,我认为 command &>/dev/null
被解析为 { command & }; > /dev/null
- 它导致 运行 后台命令 &
和 > /dev/null
我认为被忽略的部分,因为它只是重定向一个不存在的命令的输出——它是有效的语法,但什么都不执行。因为运行后台命令成功,所以if
总是成功。
最好不要使用 &>
- 请改用 >/dev/null 2>&1
。使用 diff
漂亮地打印文件比较。在批处理脚本中使用 cmp
来比较文件。
if cmp -s tmp ans.txt; then
我尝试比较两个文件并输出自定义字符串。以下是我的脚本。
#!/bin/bash
./ > tmp
if ! diff -q tmp ans.txt &>/dev/null; then
>&2 echo "different"
else
>&2 echo "same"
fi
当我执行脚本时,我得到:
sh cmp.sh ans.txt
different
Files tmp and ans.txt differ
奇怪的部分是当我输入 diff -q tmp ans.txt &>/dev/null
时。不会显示任何输出。
如何修复(我不想要行:“文件 tmp 和 ans.txt 不同”)?谢谢!
很可能您使用的 sh
版本不理解同时重定向 stdout 和 stderr 的 bash (deprecated/obsolete) 扩展 &>
时间。在 posix shell 中,我认为 command &>/dev/null
被解析为 { command & }; > /dev/null
- 它导致 运行 后台命令 &
和 > /dev/null
我认为被忽略的部分,因为它只是重定向一个不存在的命令的输出——它是有效的语法,但什么都不执行。因为运行后台命令成功,所以if
总是成功。
最好不要使用 &>
- 请改用 >/dev/null 2>&1
。使用 diff
漂亮地打印文件比较。在批处理脚本中使用 cmp
来比较文件。
if cmp -s tmp ans.txt; then