2013-09-05 113 views
6

Tôi đã đọc Chapter 2 of the Advanced Bash-Scripting Guide nơi tôi đọc về kịch bản này trong một footnote:Làm cách nào để tập lệnh được mở đầu bằng #!/Bin/rm xóa chính nó?

#!/bin/rm 
# Self-deleting script. 

# Nothing much seems to happen when you run this... except that the file disappears. 

WHATEVER=85 

echo "This line will never print (betcha!)." 

exit $WHATEVER # Doesn't matter. The script will not exit here. 
       # Try an echo $? after script termination. 
       # You'll get a 0, not a 85. 

Thường rm có một đối số và xóa tập tin đó. Ở đây, rm bằng cách nào đó biết hành động dựa trên tập lệnh mà nó thực thi. Điều đó có nghĩa là khi một vỏ gặp #!, nó sẽ chuyển đường dẫn (đầy đủ điều kiện?) Đến tệp đó làm đối số cho chương trình được chỉ định sau #!?

Trả lời

3

Có, bạn hoàn toàn đúng khi bạn nói "nó chuyển đường dẫn (đủ điều kiện?) Đến tệp đó làm đối số cho chương trình được chỉ định sau #!".

Đây là lý do tại sao các tập lệnh shell bắt đầu bằng #!/bin/sh hoặc tương tự và các tập lệnh Python bắt đầu bằng một cái gì đó như #!/usr/local/bin/python.

Dòng "shebang" được thiết kế để chạy trình thông dịch cho tập lệnh, nhưng bất kỳ tệp thực thi nào cũng có thể được chỉ định.

3

Giả sử tên của tập tin kịch bản của bạn là foo, và nó bắt đầu với công việc:

#!/bin/sh 

Nó như thể khi bạn chạy các kịch bản, nó giống như bạn chạy nó thích:

/bin/sh foo 

Trong ví dụ của bạn, shebang là:

#!/bin/rm 

Vì vậy, nó giống như chạy tập lệnh như:

/bin/rm foo 

kết quả sẽ tự xóa.

2

Khi một kịch bản có chứa một shebang và được thực hiện bằng cách nói:

./path/to/script 

bộ nạp chương trình được hướng dẫn để chạy các đường dẫn cụ thể trong dòng công việc với đường dẫn đến kịch bản như một cuộc tranh cãi.

Trong trường hợp của bạn, kịch bản chứa #!/bin/rm như dòng đầu tiên, và thực hiện nó bằng cách nói

./selfdeletingscript.sh 

sẽ gây ra những điều sau đây để được thực thi:

/bin/rm ./selfdeletingscript.sh 

Ngoài ra, bạn có thể đã quan sát thấy việc thực thi tập lệnh của bạn bằng cách nói:

/bin/sh ./selfdeletingscript.sh 

hoặc

bash ./selfdeletingscript.sh 

sẽ không xóa nó vì bạn đã định đường dẫn đến thông dịch viên.

1

Vâng, bash thực thi kịch bản như

/bin/rm <Name of script file> [Optional arguments] 

Từ man bash trang

Nếu chương trình là một tập tin bắt đầu với # !, phần còn lại của dòng đầu tiên xác định một thông dịch viên cho chương trình. Shell thực hiện trình thông dịch được chỉ định trên các hệ điều hành không xử lý định dạng thực thi này‐‐ bản ghi. Các đối số cho trình thông dịch bao gồm một đối số tùy chọn duy nhất sau tên của trình thông dịch trên dòng đầu tiên của chương trình , tiếp theo là tên của chương trình, tiếp theo là các đối số lệnh, nếu có.

+3

Về bất kỳ hệ thống giống Unix nào, '#!' Được xử lý bởi hạt nhân chứ không phải bởi trình bao. –

+0

@KeithThompson: Cảm ơn vì điều đó! Đó là thực tế tại (không may) unstated) trái tim của câu hỏi của tôi. Vì vậy, trình bao vượt qua kiểm soát để 'tập tin' và sau đó đến hạt nhân? –

+0

@KeithThompson bạn có thể giải thích nó không? Khi bạn gõ lệnh trong bash cho sh interpreter, bash sẽ phân tích cú pháp dòng đầu tiên của tập tin cho #! để tìm bất kỳ trình thông dịch nào khác được yêu cầu để thực thi tệp. Vui lòng xem phần "GIAO THÔNG THƯỜNG XUYÊN" trong trang bash man để biết chi tiết cách bash thực thi lệnh. –