Làm cách nào để làm cho bash -x (chế độ gỡ lỗi) lặp lại thành các tập lệnh có nguồn gốc?


10

Tôi đang cố gắng gỡ lỗi những gì bash làm khi khởi tạo đăng nhập cho Linux. Tôi đã đọc rằng "bash -x" sẽ làm cho bash in ra những gì nó đang làm, nhưng nó không in các lệnh trong các tệp có nguồn gốc như "set -x". Tôi không thể sử dụng "set -x" vì khởi tạo chạy trước khi tôi có thể gọi nó. "Bash -x" dường như tái diễn tốt trên OS X, nhưng đó có thể là do các phiên bản bash.

Linux: 3.2.25

HĐH X: 3.2.48

Đây là một đoạn trích về hành vi không đệ quy trên Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

Lưu ý cách /etc/profile.d/vim.sh có nguồn gốc, nhưng các lệnh của nó không được in. Có một cách giải quyết mà không cần nâng cấp? Đây có phải là do sự khác biệt phiên bản?

Câu trả lời:


1

set -xở đâu đó trong tệp gốc (tệp yêu cầu tất cả các tệp khác) sẽ hoạt động. Ngoài ra, giới thiệu một cái gì đó như [[ !-z "$DEBUG" ]] && set -xtrong mỗi tệp, và gọi với DEBUG=1 script.sh.


Tập tin gốc ở đâu? Là nền tảng độc lập?
Kelvin

Với "tập tin gốc" tôi chỉ đơn giản là tập tin bạn đang gọi trên shell và đang nhập các tập tin khác. Trong ví dụ của tôi, tệp gốc sẽ là script.sh
mkaito

1
Nhưng khởi tạo đăng nhập bash xảy ra trước khi tập lệnh được chạy. Quá muộn để chạy "set -x" trong tập lệnh. Hãy tự thử - chạy "bash -l -x script.sh". Bạn sẽ thấy những thứ xảy ra trước khi các lệnh của tập lệnh của bạn được chạy.
Kelvin

Tại sao trên trái đất bạn sẽ chạy một kịch bản với bash -l? Điều đó có nghĩa là cho các vỏ tương tác. Một kịch bản không phải là một vỏ tương tác.
mkaito

3
Xin hãy cởi mở hơn một chút - rõ ràng những người tạo ra bash nghĩ rằng nó sẽ hữu ích. Tôi thấy 2 cách sử dụng (ít nhất): 1) Bạn muốn chạy ssh user@host 'bash -l -c command'để bạn tải env thích hợp. 2) Bạn là một sysadmin và muốn khắc phục sự cố các tập lệnh init đang làm gì trước khi tập lệnh của bạn chạy - bash -l -xsẽ hiển thị cho bạn. Đôi khi bạn muốn biết nơi một biến env đang được đặt.
Kelvin

0

Vì bạn đang tìm nguồn cung cấp tập lệnh và không thực thi, lệnh đầu tiên của bạn trong tập lệnh chính phải là "set -x"

Bây giờ tất cả các tập lệnh có nguồn gốc sẽ chạy trong gỡ lỗi nhiều hơn. Hãy nhớ khi bạn lấy một tập lệnh, nó sẽ chạy trong trình bao hiện tại của bạn, vì vậy nếu bạn đặt -x một lần, điều đó sẽ tốt cho tất cả các tập lệnh nguồn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.