it-swarm-vi.tech

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?

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.

90
Epeius
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; ...;)

114
Steven Parkes

Đâ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ụ) riêng lẻ. 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.

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

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

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

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

set -o xtraceset +o xtrace là 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 mẹo tại đây

4
pihentagy

Có một số cách.

#!/usr/bin/env bash -x

như dòng Shebang.

Kể cả set -x trong chính tập lệnh sẽ kích hoạt chức năng trong khi set +x sẽ vô hiệu hóa nó. Cả hai phương pháp này cũng sẽ hoạt động với Shell sh di động hơn.

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

3
user6784

đ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.

1
debuggerpk

#! /bin/bash -x làm những gì bạn muốn.

0
Rory