2011-11-15 13 views
14

jestem importowania pliku do mojego serwera za pomocą tego polecenia:Shellscript działanie czy dwa pliki są różne

scp [email protected]:/test/test/test/server.py /test/test/test/test.py~/; 

chcę ponownie uruchomić serwer, jeśli nowo importowany plik test.py ~ różni się od test.py to już istnieje. Jak mógłbym to zrobić za pomocą skryptu skorupowego?

+0

Mam nadzieję, że oznacza to „zrestartować demona” nie „restart mojego serwera” – Sorpigal

+0

Prawdopodobnie nie chcą ostateczna „/”; w tym poleceniu, ponieważ nie jest katalogiem i nie masz innego polecenia w tej samej linii. –

+0

@peter masz na myśli, jeśli ładunek plików różni się od jednego pliku i sprawdzić każdy? w komentarzu do mojej odpowiedzi poniżej. – gadgetmo

Odpowiedz

4

Można rozróżnić() dwa pliki. Kod powrotu równy zero (0) oznacza, że ​​nie ma różnic. Kod powrotu jednego (1) mówi, że pliki różnią się.

+1

To jest dokładnie to, co chcę zrobić. Znowu jestem nowicjuszem, myślisz, że podasz mi przykład lub link do przykładu? – Spencer

+0

@peter zobacz moją odpowiedź na przykład/link. – gadgetmo

+0

Dlaczego używać diff, gdy 'cmp' jest zbudowany na to? – Sorpigal

42
if ! cmp test.py test.py~ >/dev/null 2>&1 
then 
    # restart service 
fi 

Łamanie że dół:

  • cmp test.py test.py~ zwraca true (0) jeśli test.py i test.py ~ są identyczne, w przeciwnym wypadku false (1). Możesz to zobaczyć w man cmp.
  • ! odwraca wynik, więc wyrażenie if tłumaczy się na "jeśli test.py i test.py ~ są różne".
  • Przekierowania >/dev/null 2>&1 wysyłają wszystkie dane wyjściowe z cmp do null device, więc otrzymujesz wynik porównania prawdziwy/fałszywy, bez niepożądanych szumów na konsoli.
+0

+1, ale -q jest niestandardowy. Przekierowanie do/dev/null zawsze zadziała. –

+0

Przepraszam, czy ktoś mógłby wytłumaczyć pierwszą linię dla basha nooba? Jaki jest precedens dla argumentu operatora if? Dlaczego istnieją te dwa przekierowania i co one oznaczają? – user1512321

+0

@AndrewSchulman: Dzięki, użyłem w scenariuszu. Jeśli to rozumiem, dane wyjściowe typu Boolean i standardowe wyjście są wysyłane do instrukcji if, więc aby uzyskać odpowiedź typu boolean, należy wysłać standardowe wyjście do bufora bitowego. – user1512321

0

zrobiłbym coś takiego

[email protected]$ cat /test/test/test/server.py | ssh [email protected] '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)' 
Powiązane problemy