web-dev-qa-db-ja.com

2つのファイルが異なる場合のシェルスクリプトアクション

次のコマンドを使用して、サーバーにファイルをインポートしています。

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

新しくインポートしたファイルtest.py〜が既存のtest.pyと異なる場合は、サーバーを再起動したいと思います。シェルスクリプトを使用してこれを行うにはどうすればよいですか?

20
Spencer

2つのファイルをdiff()することができます。ゼロ(0)の戻りコードは、違いがないことを意味します。 1の戻りコードは、ファイルが異なることを示しています。

7
JRFerguson
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デバイス に送信するため、コンソールに不要なノイズが発生することなく、真/偽の比較結果が得られます。
50
Andrew Schulman

私は次のようなことをします

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)'
0
sorpigal