Điều gì thực sự xảy ra là bash mà giữ tệp đang mở và rm
sẽ không làm dừng lại đó.
Vì vậy, rm
gọi hàm libc là "unlink()" sẽ xóa "liên kết" sang inode từ thư mục trong đó. "Liên kết này" trên thực tế là tên tệp cùng với số inode (bạn có thể thấy inode) số với ls -i
).
Inode tồn tại miễn là chương trình mở.
Bạn có thể dễ dàng kiểm tra tuyên bố này như sau:
$ echo read a> ni
$ bash ni
trong khi ở một cửa sổ khác:
$ pgrep -lf bash\ ni
31662 bash ni
$ lsof -p 31662|grep ni
bash 31662 wmertens 255r REG 14,2 7 12074052 /Users/wmertens/ni
$ rm ni
$ lsof -p 31662|grep ni
bash 31662 wmertens 255r REG 14,2 7 12074052 /Users/wmertens/ni
Các tập tin vẫn mở ngay cả khi bạn không còn có thể nhìn thấy nó trong ls. Vì vậy, nó không phải là bash đọc toàn bộ tập tin - nó chỉ là không thực sự đi cho đến khi bash được thực hiện với nó.
Khi một ứng dụng được thực hiện, mã của nó được tải vào bộ nhớ. Bạn chỉ xóa tệp trên đĩa, điều này không ảnh hưởng đến mã trong bộ nhớ. –
Có lẽ toàn bộ tập lệnh được đọc vào bộ nhớ khi thực hiện và do đó các lệnh sau 'rm test.sh' vẫn tồn tại trong bộ nhớ được thực hiện. – MrMisterMan
Nó không tạo bản sao trong bộ nhớ. Vì vậy, ví dụ, nếu kịch bản được sửa đổi trong khi nó đang chạy, nó sẽ thực hiện các sửa đổi. Điều này đã khiến tôi đau đầu gần đây. Ví dụ dễ thương: tập lệnh một dòng này sẽ điền vào đĩa của bạn theo thứ tự ngắn: 'cat $ 0 >> $ 0'. – Ned