【问题标题】:Shellscript action if two files are different如果两个文件不同,则执行 Shellscript 操作
【发布时间】:2011-12-29 16:57:01
【问题描述】:

我正在使用以下命令将文件导入我的服务器:

scp zumodo@shold:/test/test/test/server.py /test/test/test/test.py~/;

如果新导入的文件 test.py~ 与已经存在的 test.py 不同,我想重新启动我的服务器。我将如何使用 shellscript 来做到这一点?

【问题讨论】:

  • 我希望你的意思是“重启我的守护进程”而不是“重启我的服务器”
  • 你可能不想要最后的 '/;'在该命令上,因为它不是目录,并且您在同一行上没有其他命令。
  • @peter 你的意思是如果文件负载与一个文件不同并检查每个文件?在您对下面我的回答的评论中。

标签: bash shell scp


【解决方案1】:
if ! cmp test.py test.py~ >/dev/null 2>&1
then
  # restart service
fi

分解:

  • cmp test.py test.py~ 如果 test.py 和 test.py~ 相同,则返回 true (0),否则返回 false (1)。您可以在man cmp 中看到这一点。
  • ! 反转该结果,因此 if 语句转换为“如果 test.py 和 test.py~ 不同”。
  • 重定向>/dev/null 2>&1cmp 的所有输出发送到null device,因此您只需得到真假比较结果,而不会在控制台上出现任何不必要的噪音。

【讨论】:

  • +1,但 -q 是非标准的。重定向到 /dev/null 将始终有效。
  • 抱歉,有人能解释一下 bash 菜鸟的第一行吗? if 运算符的参数的优先级是什么?为什么会有这两个重定向,它们是什么意思?
  • 您也可以使用cmp -s 来抑制比较的终端输出。
  • @PolyBug:是的,但这是 Unix/Linux 中的惯例。原因是成功只有一种,而失败可能有很多种,会返回不同的状态码。例如,请参阅 man lsman grep 的退出状态部分。
  • 即使文件不存在也是正确的。
【解决方案2】:

我会做类似的事情

zumodo@shold$ cat /test/test/test/server.py | ssh zumodo@otherhost 'cat - > /test/test/test/test.py.new ; cmp /test/test/test/test.py /test/test/test/test.py.new || (mv /test/test/test/test.py.new /test/test/test/test.py ; echo issue restart command here)'

【讨论】:

    【解决方案3】:

    你可以 diff() 这两个文件。返回代码为零 (0) 表示没有差异。一 (1) 的返回码表示文件不同。

    【讨论】:

    • 这正是我想做的。再说一次,我是个新手,你认为你给我提供了一个例子还是一个例子的链接?
    • @peter 查看我的答案,例如/链接。
    • cmp为此而构建时,为什么要使用差异?
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多