Liên quan: Trình thông dịch shell nào chạy tập lệnh không có shebang?
Kịch bản không có shebang / hashbang / #!
line, đơn giản là vì dấu gạch ngang kép không có #!
.
Tuy nhiên, tập lệnh sẽ được thực thi bởi shell (xem câu hỏi và câu trả lời được liên kết ở trên) và trong shell đó, nếu -
là một ký tự hợp lệ trong tên hàm, dòng này khai báo một hàm shell gọi là --
không có gì (tốt, nó chạy :
, mà không có gì ) và không bao giờ được gọi.
Hàm này, trong ký hiệu nhiều dòng phổ biến hơn (chỉ để làm cho nó rõ ràng hơn trông như thế nào, vì tên kỳ lạ của nó che khuất thực tế rằng nó thực sự là một hàm):
-- () {
:
}
Mục đích duy nhất của định nghĩa hàm là có một dòng hợp lệ trong tập lệnh shell và đồng thời là một lệnh SQL hợp lệ (một nhận xét). Loại mã này được gọi là một polyglot .
Sau khi khai báo hàm shell không có thật, tập lệnh, khi được trình thông dịch shell shell thực thi, sử dụng exec
để thay thế trình bao hiện tại bằng quy trình do chạy db2 -txf "$0"
, sẽ giống như sử dụng db2 -txf
tên đường dẫn của tập lệnh từ dòng lệnh.
Thủ thuật này có thể sẽ không hoạt động đáng tin cậy trên các hệ thống trong đó dash
hoặc các ash
vỏ dựa trên khác yash
, vỏ Bourne ksh88
hoặc ksh93
được sử dụng như /bin/sh
là vì các vỏ này không chấp nhận các hàm có tên chứa dấu gạch ngang.
Cũng liên quan:
Tôi cho rằng những điều sau đây cũng sẽ hoạt động (không thực sự được thử nghiệm):
--() { exec db2 -txf "$0"; }; --