tương đương với tiếng vang trên nền tảng dành cho linux?


27

Làm thế nào tôi có thể nhận được tất cả các lệnh chạy trong bash script?

Đó là đầu ra phải chứa lệnh đầu ra VÀ chính các lệnh.

tôi đã tìm thấy

#!/bin/bash -x

nhưng điều này không hoàn toàn giống nhau vì thay vì

 mysql -v dbname < dump.sql | grep "CREATE TABLE"

nó cho thấy

+ mysql -v dbname
+ grep 'CREATE TABLE'

Câu trả lời:


29

Sử dụng bash -v.

Đây là kịch bản:

#!/bin/bash -v

echo "Hello, World" | sed 's|Hello|Goodbye|'

echo "Done."

Đây là đầu ra:

#!/bin/bash -v

echo "Hello, World" | sed 's|Hello|Goodbye|'
Goodbye, World

echo "Done."
Done.

Thật không may, không có điểm đánh dấu đặc biệt như PS4để in các lệnh mở rộng. Bạn có thể kết hợp cả hai mặc dù để nhanh chóng xác định các lệnh:

#!/bin/bash -vx

echo "Hello, World" | sed 's|Hello|Goodbye|'
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World

echo "Done."
+ echo Done.
Done.

12

set -x là cách khác để làm điều đó.

$ cat a.sh
#!/bin/bash

set -x
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."

Đầu ra sẽ là:

sh a.sh
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.

1
Đó là loại những gì OP đã coi là vô dụng ngay trong câu hỏi của anh ấy ...
Daniel Beck

@Ashok Bạn có thể giải thích? Tôi không thể thấy sự khác biệt: ở đây ps: GNU bash, phiên bản 4.1.5 (1) -release (i486-pc-linux-gnu) Ubuntu 10.04.3
Putnik

1
@Putnik Đó là điều cơ bản tương tự, nhưng bạn có thể set -xở bất kỳ đâu trong tập lệnh và thậm chí hủy kích hoạt lại. Vì vậy, nếu bạn chỉ muốn nó trên echo "Done"dòng, đặt set -xngay trước đó.
Daniel Beck
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.