2011-11-15 30 views
14

Tôi đang nhập khẩu một tập tin vào máy chủ của tôi sử dụng lệnh này:shellscript hành động nếu hai tập tin khác nhau

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

Tôi muốn khởi động lại máy chủ của tôi nếu test.py tập tin mới nhập ~ khác với test.py đã tồn tại. Làm thế nào tôi sẽ làm điều này bằng cách sử dụng một shellscript?

+0

Tôi hy vọng bạn có nghĩa là "khởi động lại daemon của tôi" không phải là "khởi động lại máy chủ của tôi" – Sorpigal

+0

Bạn có lẽ không muốn trận chung kết '/;' trên lệnh đó, bởi vì nó không phải là một thư mục và bạn không có lệnh khác trên cùng một dòng. –

+0

@peter bạn có nghĩa là nếu tải tệp khác với một tệp và kiểm tra từng tệp? trong bình luận của bạn về câu trả lời của tôi dưới đây. – gadgetmo

Trả lời

4

Bạn có thể diff() hai tệp. Mã trả về bằng không (0) có nghĩa là không có sự khác biệt. Mã trả về của một (1) cho biết các tệp khác nhau.

+1

Đây chính là điều tôi muốn làm. Một lần nữa tôi là một người mới, bạn có nghĩ rằng bạn cung cấp cho tôi một ví dụ hoặc một liên kết đến một ví dụ? – Spencer

+0

@peter xem câu trả lời của tôi cho ví dụ/liên kết. – gadgetmo

+0

Tại sao sử dụng diff khi 'cmp' được xây dựng cho điều này? – Sorpigal

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

Breaking đó xuống:

  • cmp test.py test.py~ trả về true (0) nếu test.py và test.py ~ là giống hệt nhau, khác sai (1). Bạn có thể thấy điều này trong man cmp.
  • ! chuyển đổi kết quả, do đó, câu lệnh if dịch thành "nếu test.py và test.py ~ khác".
  • Chuyển hướng >/dev/null 2>&1 gửi tất cả đầu ra của cmp đến null device, vì vậy bạn chỉ nhận được kết quả so sánh đúng/sai, không có bất kỳ tạp âm không mong muốn nào trên bảng điều khiển.
+0

+1, nhưng -q không chuẩn. Chuyển hướng đến/dev/null sẽ luôn hoạt động. –

+0

Xin lỗi, ai đó có thể giải thích dòng đầu tiên cho một bash noob? Ưu tiên cho đối số của toán tử if là gì? Tại sao có hai chuyển hướng đó và chúng có ý nghĩa gì? – user1512321

+0

@AndrewSchulman: Cảm ơn, tôi đã sử dụng trong tập lệnh. Nếu tôi hiểu điều này, đầu ra Boolean và stdout đều được gửi đến if, do đó, để chỉ có câu trả lời boolean, bạn phải gửi stdout tới nhóm bit. – user1512321

0

Tôi muốn làm điều gì đó như

[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)' 
Các vấn đề liên quan