Tôi hiểu rằng đó dashlà một vỏ "mô hình" - nó được viết gần đây và tốt và nó chỉ thực hiện những gì được yêu cầu của vỏ POSIX. Tôi đã xem mã nguồn dash để hiểu cách "truy tìm" của một chương trình như shell, được thực hiện.
"Truy tìm" dấu gạch ngang được thực hiện bằng cách biên dịch nó với DEBUGđịnh nghĩa và gọi với -o debug. Khi bạn làm điều đó, một tệp traceđược mở ra với fopenthông tin nào được đưa ra về những gì dashđang làm khi nó chạy.
Ngoại trừ toàn bộ cơ chế, xuất hiện với tôi, không hoạt động, ngay cả trong lớp vỏ "được viết hoàn hảo" này. Nếu tôi có cái này trong shell script:
exec 3>&1
ngay lập tức tất cả các thông tin sau đó, rất có thể không còn được đưa vào tập tin tracemà tiếp tục stdout. Đó là bởi vì fopencác cuộc gọi openvà có khả năng trả về mô tả tệp 3.
Đây không phải là một ví dụ giả định. Có những kịch bản trong thế giới thực thường được sử dụng có các dòng như
execcon số>&1
(Tôi thấy rằng trong 2 configuretập lệnh tự động : cho phần mềm IP Infusion và Kerberos).
Vậy làm thế nào một shell có thể được gỡ lỗi / theo dõi, khi nó phải chạy các script như thế này?
(Tôi không tìm kiếm các công cụ bên ngoài shell - Tôi muốn biết đâu là cách chính xác để theo dõi, bên trong một chương trình như shell. Hay nói chung là không thể?