Làm thế nào để thực thi tập lệnh bash từng dòng?


93

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

Làm thế nào tôi có thể thực hiện từng dòng một? Tôi có thể xem liệu nó có làm đúng hay không, hay tôi hủy bỏ và sửa lỗi. Hiệu ứng tương tự được đặt readtrong mỗi dòng.


Câu trả lời:


126

Bạn không cần phải đọc mỗi dòng, chỉ cần thêm một cái bẫy như sau vào tập lệnh bash của bạn, nó có hiệu ứ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 nó với bash v4.2.8 và v3.2.25.


PHIÊN BẢN CẢI TIẾN

Nếu tập lệnh của bạn đang đọc nội dung từ các tệp, danh sách ở trên sẽ không hoạt động. Một 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 >

Để dừng tập lệnh, bạn sẽ phải giết nó khỏi một trình bao khác trong trường hợp này.


ALTERNATIVE1

Nếu bạn chỉ muốn đợi một vài giây trước khi tiếp tục lệnh tiếp theo trong tập lệnh của mình, ví dụ sau có thể phù hợp với 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 trong lệnh trap để 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)?
David Doria

2
Nó bẫy một lần đọ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
hữu cơ-mashup

1
nếu bạn có các dòng lệnh như thế này "while read line; do echo $ line; done <somefile" thì phương thức đó không hoạt động vì dòng đọc "trap read DEBUG" từ somefile
mug896

3
Làm thế nào để bạn làm cho nó dừng lại? Sau khi tôi xem qua script đến cuối, shell hoạt động giống như script vẫn đang chạy.
slashdottir

1
Thay đổi để trap 'read -u1' debugghi đè vấn đề chuyển hướng đọc tệp.
user3132194 16/12/16

23

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


3
Đây thực sự là giải pháp tốt nhất. Nó cho phép xem đường truyền trước khi chạy (và nhiều hơn thế 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, nhập stepvà sau đó nhấn xuống dòng sau đó.
studgeek

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

@Sajuuk, nó có thể không được đóng gói , nhưng nó hoàn toàn có sẵn .
Charles Duffy

macOS:brew install bashdb
boweeb

@CharlesDuffy: nó cũng không có trong repo mặc định của Ubuntu.
Dan Dascalescu

2

Nếu tập lệnh bash của bạn thực sự là một loạt các lệnh tắt mà bạn muốn chạy từng lệnh một, bạn có thể làm điều gì đó như thế này, chạy từng lệnh một khi bạn tăng một biến LN, tương ứng với số dòng bạn muốn chạy . Điều này cho phép bạn chỉ cần chạy lại lệnh cuối cùng một cách siêu dễ dàng và sau đó bạn chỉ cần tăng biến để chuyển đế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 chạy lần lượt các lệnh sau.

$ 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


1

xargs: có thể lọc dòng

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 Coi như đầu vào thô (không thoát)
  • -l Tách từng dòng (Không phải theo mặc định cho các buổi biểu diễn)
  • -d \\ n Dấu phân cách dòng
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.