Làm thế nào để tạo các tập lệnh bash in ra mọi lệnh trước khi nó thực thi?


88

Ví dụ: tôi có một tệp bash đơn giản

#!/bin/bash
cd ~/hello
ls

Làm thế nào tôi có thể làm cho nó hiển thị mọi lệnh trước khi thực hiện nó? Chỉ có tác dụng ngược lại của "@echo tắt" trong kịch bản lô của windows.


1
Đối với những người tìm kiếm các settùy chọn là gì, bạn có thể tìm thấy chúng trên trang người đàn ông này .
mkobit

Bạn chỉ có thể mở rộng #!/bin/bash -x
shebang

Câu trả lời:


110
bash -x script

hoặc là

set -x

trong kịch bản.

Bạn có thể hủy đặt lại tùy chọn với set +x. Nếu bạn chỉ muốn làm điều đó cho một vài lệnh, bạn có thể sử dụng một lớp con: `(set -x; lệnh1; lệnh; ...;)


Tôi đã luôn luôn sử dụng điều này để có hiệu quả tuyệt vời. Đầu ra trông hơi bẩn hơn bạn mong đợi.
Scott Pack

2
Bằng cách thiết lập, PS4bạn có thể điều chỉnh lời nhắc của -x. Ví dụ: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( datesẽ làm chậm nó xuống)
Walter Tross

23

Đây cũng là công việc:

set -v

hoặc là

#!/bin/bash -v

Nhưng -v không in chuỗi PS4 trước mỗi dòng script và nó không theo dõi các bước của câu lệnh "for" (ví dụ). Nó không lặp lại bình luận trong khi -x thì không.

Đây là một ví dụ về đầu ra sử dụng -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Đây là kết quả của cùng một tập lệnh với -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Lưu ý rằng tôi đã bao gồm "echo -n" để thêm điểm nhấn cho sự khác biệt giữa -v và -x. Ngoài ra, -v giống như "-o verbose", nhưng cái sau dường như không hoạt động như một phần của shebang.


Giải thích tuyệt vời! mà không thực hiện bất kỳ nghiên cứu nào, có vẻ như Verbose và eXplicit là những gì hai chữ cái đó đại diện.
Ape-inago

Tôi nghĩ rằng -x gần gũi hơn với eXecute.
Steven Parkes

10

Điều này cũng sẽ làm việc:

#!/bin/bash -x
cd ~/hello
ls

6

Điều này sẽ làm việc:

set -o verbose #echo on
...
set +o verbose #echo off

4

set -o xtraceset +o xtracelà bạn bè của bạn (nó dài dòng hơn -o verbose, và đầu ra chuyển sang STDERR, trái ngược với verbose, dường như đăng nhập vào STDOUT).

Xem thêm lời khuyên ở đây


3

Có một số cách.

#!/usr/bin/env bash -x

như dòng shebang.

Bao gồm set -xtrong chính kịch bản sẽ kích hoạt chức năng trong khi set +xsẽ vô hiệu hóa nó. Cả hai phương pháp này cũng sẽ hoạt động với vỏ sh di động hơn.

Nếu tôi nhớ chính xác thì perl cũng có tùy chọn -x.


1

đi như

language -x script

ngôn ngữ = python, perl, bash -x = toán tử script = tên tệp

hy vọng nó giúp.


3
-xkhông có gì để lặp lại trong Python
Eugene Pankov

0

#! /bin/bash -x làm những gì bạn muố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.