2012-01-31 39 views
63

Nếu tôi nhập bash -x tùy chọn, nó sẽ hiển thị tất cả các dòng. Nhưng kịch bản sẽ thực thi normaly.Cách thực thi dòng lệnh bash theo dòng?

Tôi làm cách nào để thực thi từng dòng? Hơn tôi có thể nhìn thấy nếu nó làm điều đúng, hoặc tôi hủy bỏ và sửa lỗi. Cùng một hiệu ứng được đặt read trong mỗi dòng.

+0

lẽ rộng hơn xem thêm https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee

Trả lời

87

Bạn không cần phải đặt một đọc trong mỗi dòng, chỉ cần thêm một cái bẫy như sau vào kịch bản bash của bạn, nó có tác dụng bạn muốn, ví dụ.

#!/usr/bin/env bash 
set -x 
trap read debug 

< YOUR CODE HERE > 

Hoạt động, chỉ cần thử nghiệm với bash v4.2.8 và v3.2.25.


phiên bản cải tiến

Nếu kịch bản của bạn đang đọc nội dung từ các tập tin, các liệt kê ở trên sẽ không làm việc. Cách giải quyết có thể giống như ví dụ sau.

#!/usr/bin/env bash 
echo "Press CTRL+C to proceed." 
trap "pkill -f 'sleep 1h'" INT 
trap "set +x ; sleep 1h ; set -x" DEBUG 

< YOUR CODE HERE > 

Để ngăn chặn kịch bản bạn sẽ phải giết nó từ một vỏ trong trường hợp này.


ALTERNATIVE1

Nếu bạn chỉ đơn giản là muốn chờ đợi một vài giây trước khi tiến hành lệnh tiếp theo trong kịch bản của bạn ví dụ sau đây có thể làm việc cho bạn.

#!/usr/bin/env bash 
trap "set +x; sleep 5; set -x" DEBUG 

< YOUR CODE HERE > 

Tôi đang thêm set + x và set -x vào lệnh bẫy để làm cho đầu ra dễ đọc hơn.

+1

Sau đó, làm thế nào để bạn bước sang dòng tiếp theo (chạy lệnh tiếp theo)? –

+2

Nó bẫy một đọc trên mỗi lệnh.Chỉ có điều bạn cần làm là nhấn trở lại để có được lệnh tiếp theo –

+0

Làm việc với ksh là tốt, nếu một người thích sử dụng trình bao khác. – ChrisGer

10

Có thể BASH Debugger là thứ dành cho bạn.

+1

Đây thực sự là giải pháp tốt nhất. Nó cho phép xem các dòng trước khi nó được chạy (và nhiều hơn nữa). Trên hầu hết các hệ thống, nó có thể được cài đặt với 'apt-get install bashdb'. Sau đó, bạn chỉ cần chạy 'bashdb your_command.sh', gõ' step', và sau đó nhấn trở về sau đó. – studgeek

+0

@studgeek nó không có sẵn trên Redhat/CentOS vv vì vậy tôi sẽ không gọi đó là "hầu hết các hệ thống". – Sajuuk

0

Nếu tập lệnh bash của bạn thực sự là một loạt các lệnh mà bạn muốn chạy từng cái một, bạn có thể làm như thế này, chạy từng lệnh một khi bạn tăng biến LN, tương ứng với dòng số bạn muốn chạy. Điều này cho phép bạn chỉ cần chạy lệnh cuối cùng một lần nữa siêu dễ dàng, và sau đó bạn chỉ cần tăng biến để đi đến lệnh tiếp theo.

Giả sử các lệnh của bạn nằm trong tệp "it.sh", hãy thực hiện theo từng bước một.

$ cat it.sh 
echo "hi there" 
date 
ls -la /etc/passwd 

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1) 
"hi there" 

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1) 
Wed Feb 28 10:58:52 AST 2018 

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1) 
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd 
Các vấn đề liên quan