Nếu, khi tôi chạy tập lệnh, tôi sử dụng LD_PRELOAD
để chỉ định thư viện để tải trước, tôi thấy rằng thư viện trên thực tế được tải trước chỉ khi tập lệnh có dòng shebang. Ví dụ, đưa ra kịch bản này:Tại sao LD_PRELOAD không có hiệu lực với các tập lệnh không có shebang?
# Not a shebang
echo Hello
và lệnh này:
LD_PRELOAD=/path/to/preload_me.so ./script.sh
kịch bản chạy mà không có thư viện được nạp ở tất cả, mà tôi có thể giám sát thông qua các hiệu ứng (phi) khởi tạo của nó mã.
Mặt khác, nếu tôi thêm một dòng công việc:
#!/bin/sh
echo Hello
... sau đó thư viện là nạp khi tôi chạy kịch bản thông qua cùng một lệnh. Nó không có vẻ quan trọng chính xác mà thông dịch viên được chỉ định; chắc chắn tôi cũng có thể sử dụng /bin/bash
hoặc bất kỳ vỏ nào khác sh
-gia đình mà tôi đã thử.
Tại sao có sự khác biệt và có cách nào để đảm bảo rằng một thư viện nhất định được tải trước trước một lệnh shell đơn giản nhất định, không phụ thuộc vào lệnh?
(Phỏng theo another question mà tác giả chống lại câu hỏi được diễn đạt bằng những thuật ngữ này.)
Đây là một câu trả lời hay, nhưng tôi nghĩ bạn nên làm rõ rằng nó áp dụng cụ thể cho 'bash' (và có lẽ các shell khác.)' Dash' dường như không làm điều này, ví dụ. (Nó thực thi kịch bản, nhưng quá trình tải trước có hiệu lực.) Tất cả Posix nói là "trình bao sẽ thực hiện một lệnh tương đương với việc có một trình bao được gọi ra với tên đường dẫn xuất phát từ tìm kiếm như toán hạng đầu tiên của nó," có thể áp dụng cho cả hai hành vi. (Kiểm tra nhanh trên hệ thống của tôi: zsh preloads, ksh không. Đi con số.) – rici
@rici, câu trả lời rõ ràng nói rằng * 'bash' * forks thay vì exec'ing một quá trình shell mới, nhưng tôi vẫn có thêm làm rõ. –