Có an toàn để loại bỏ một tập tin tập lệnh từ trong tập lệnh đó?


9

Hãy tưởng tượng tôi có một kịch bản foo. Nó nên được chạy một lần khi người dùng đăng nhập và không cần thiết sau khi chạy thành công.

Câu hỏi của tôi: Có an toàn để xóa tệp tập lệnh từ trong tập lệnh không?

Ví dụ:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0

2
Không hoàn toàn không liên quan, bạn có thể sử dụng #!/bin/bash -eđể đảm bảo rằng tệp script chỉ bị xóa nếu không có gì sai.
sr_

3
Vâng, nó an toàn. Nếu bạn muốn biết, tại sao, hãy đọc stackoverflow.com/questions/2028874/
Kẻ

2
@jofel Nghe hay đấy, tôi khuyên bạn nên làm điều này một câu trả lời. :-)
htorque

Nếu nghi ngờ bạn có thể thay thế hai dòng cuối cùng bằng exec rm /path/to/foo.
kasperd

Câu trả lời:


5

Việc gỡ bỏ tệp shell trong khi chạy nó là an toàn, vì trình xử lý tệp không bị ảnh hưởng bởi (tái) di chuyển tệp tương ứng.

Để biết thêm thông tin, xem tại đây .


2
Chỉ cần lưu ý rằng nó có thể không hoạt động, tùy thuộc vào hệ thống của bạn (tức là rm <it-self>sẽ không thành công trên HP-Ux.
Ouki

1
@Ouki, tại sao? Điều đó có vi phạm POSIX không?
maxschlepzig

3
@maxschlepzig POSIX cho phép xóa liên kết cuối cùng đến một tệp thực thi hiện đang được thực thi để thất bại: unlinkcó thể thất bại với ETXTBUSY. (Lạ lùng, thủ tục thuần túy của người Hồi giáo và văn bản chia sẻ của người Do Thái không được định nghĩa trong thông số kỹ thuật; AFAIK có nghĩa là một thành phần của một chương trình thực thi: chính nó có thể thực thi được hoặc một thư viện mà nó sử dụng). Tất cả các thông báo chính khác ngoài HP-UX cho phép các tệp thực thi được đổi tên và hủy liên kết.
Gilles 'SO- ngừng trở nên xấu xa'

2
@Ouki Điều đó thật dễ dàng để có được xung quanh bằng cách đơn giản là kết thúc tập lệnh với exec rm /path/to/foo.
kasperd

0

Tôi luôn lo lắng về điều này vì vậy tôi đã làm:

(sleep 5; rm /path/to/shell/script) &
exit 0

Thay phiên, bạn có thể xâu chuỗi thành một tập lệnh tạm thời:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme

1
Trong cả hai cách tiếp cận được đề xuất của bạn, vẫn sẽ có một quy trình shell chưa hoàn thành việc thực thi tập lệnh vào thời điểm nó bị xóa.
kasperd

Những gì bạn muốn làm làexec rm /path/to/shell/script
osvein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.