2010-02-18 24 views
10

Mọi người nhận thấy rằng nếu bạn sửa đổi nguồn của tập lệnh shell, mọi phiên bản hiện đang chạy đều có thể bị lỗi?Làm thế nào để làm cho kịch bản shell mạnh mẽ để nguồn được thay đổi khi chúng chạy

Điều này theo ý kiến ​​của tôi là rất xấu; điều đó có nghĩa là tôi phải đảm bảo tất cả các phiên bản của tập lệnh đều bị dừng trước khi tôi thực hiện thay đổi. Hành vi ưa thích của tôi sẽ là các tập lệnh hiện có tiếp tục chạy với mã nguồn cũ và các phiên bản mới sử dụng mã mới (ví dụ: điều gì xảy ra cho các chương trình perl và python).

Mọi người có giải pháp nào tốt cho hành vi này, không phải là sao chép trước tập lệnh shell vào tệp tạm thời và chạy từ tệp đó?

Cảm ơn, /YGA

+0

Bạn cũng có thể xóa tập lệnh trong khi đang chạy để tránh chỉnh sửa. Xem [bài đăng này] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run) vì lý do và cách tự động hóa nó. –

Trả lời

16

Ngoài Rất nhẹ cho câu trả lời khác dưới đây:

#!/bin/sh 
{ 
    # Your stuff goes here 
    exit 
} 

Các exit ở cuối là quan trọng. Nếu không, tệp tập lệnh vẫn có thể được truy cập ở cuối để xem có thêm dòng nào để diễn giải hay không.

Câu hỏi này sau đó được đăng lại tại đây: Can a shell script indicate that its lines be loaded into memory initially?

+1

Giải pháp của Jonathan Leffler là tốt, nhưng không làm việc cho tôi nếu không có lối ra :-) – YGA

2

Hãy chắc chắn rằng vỏ có để phân tích toàn bộ tập tin trước khi thực hiện bất kỳ của nó:

#!/bin/ksh 
{ 
all the original script here 
} 

Đó hiện các trick.

Ngẫu nhiên, với Perl (và tôi giả định Python), chương trình phân tích toàn bộ tệp trước khi thực hiện bất kỳ tệp nào, chính xác như được đề xuất ở đây. Đó là lý do tại sao bạn không thường gặp sự cố với Perl hoặc Python.

+0

Mã này có lỗ hổng. Xem [trả lời bởi người dùng "ẩn danh"] (http://stackoverflow.com/a/2358432/780703). –

2

Hành vi mong muốn có thể không thực hiện được, tùy thuộc vào độ phức tạp của các tập lệnh shell có liên quan.

Nếu tập lệnh shell đầy đủ được chứa trong một tệp nguồn duy nhất và tệp đó được phân tích cú pháp hoàn toàn trước khi thực thi, thì tập lệnh shell thường an toàn từ sửa đổi đối với bản sao trên đĩa trong khi thực thi. Việc gói tất cả các câu lệnh thi hành được vào một hàm (hoặc một loạt các hàm) thường sẽ đạt được mục tiêu mà bạn đang theo đuổi.

#!/bin/sh 

doit() 
{ 
# Stuff goes here 
} 
# Main 
doit 

Khó khăn xảy ra khi tập lệnh shell "bao gồm" các tập lệnh shell khác (ví dụ: "." Hoặc "nguồn"). Nếu chúng bao gồm được bao bọc trong một hàm, chúng không được phân tích cú pháp cho đến khi câu lệnh đó đạt được trong luồng thực thi. Điều này làm cho tập lệnh shell dễ bị thay đổi đối với mã bên ngoài đó. Ngoài ra, nếu tập lệnh shell chạy bất kỳ chương trình bên ngoài nào (ví dụ: shell script, chương trình được biên dịch, vv), kết quả đó sẽ không bị bắt cho đến khi đạt được điểm đó trong quá trình thực thi (nếu có).

#!/bin/sh 

doit() 
{ 
    if [[some_condition]] ; then 
     resultone=$(external_program) 
    fi 
} 
# Main 
doit 
+0

Mã của bạn nên được coi là mã giả cho 'sh'. –

Các vấn đề liên quan