Tôi hiểu rằng đó dash
là 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 fopen
thô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 trace
mà tiếp tục stdout
. Đó là bởi vì fopen
các cuộc gọi open
và 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ư
exec
con số>&1
(Tôi thấy rằng trong 2 configure
tậ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ể?