`Set -x` làm gì?


260

Tôi có một kịch bản shell với dòng sau:

[ "$DEBUG" == 'true' ] && set -x

15
Hãy xem:help -m set | less
Cyrus

4
Cảm ơn vì tiền help -m setboa. Điều đó làm việc. Tôi đã thử man settrước khi hỏi, tuy nhiên trên Ubuntu cóNo manual entry for set
Ole

2
@Ole, setđược tích hợp vào bash vì vậy nếu man bashbạn có thể tìm thấy nó trong phần SHELL BUILTIN THÔNG TIN . Khi xem trang man, có lẽ bạn có thể chuyển sang trang này bằng cách tìm kiếm biểu thức chính quy này \bset \[.
Người dùng5910

Câu trả lời:


364

set -xcho phép một chế độ của trình bao trong đó tất cả các lệnh đã thực hiện được in đến thiết bị đầu cuối. Trong trường hợp của bạn, nó rõ ràng được sử dụng để gỡ lỗi, đây là trường hợp sử dụng điển hình cho set -x: in mọi lệnh khi nó được thực thi có thể giúp bạn hình dung luồng điều khiển của tập lệnh nếu nó không hoạt động như mong đợi.

set +x vô hiệu hóa nó


5
Làm thế nào để vô hiệu hóa tính năng đó một lần nữa?
feedc0de

85
@DanielBrunner: set +xvô hiệu hóa nó.
John Zwinck

2
Đây là RẤT hữu ích! Tôi ước ai đó đã nói với tôi điều đó sớm hơn. Có những thủ thuật thú vị khác như thế này có thể giúp tăng cường kỹ năng meta của chúng ta về kịch bản không?
Sinh viên

7
@Student: set -eở đầu tập lệnh của bạn sẽ khiến tập lệnh thoát khỏi lỗi bất cứ khi nào xảy ra lỗi (và không được xử lý rõ ràng). Tôi thấy rằng vô cùng thích hợp với mặc định, đó là tiếp tục đi lang thang (như tai tiếng của Visual Basic On Error Resume Next).
John Zwinck

1
Thật không may, @JohnZwinck, set -ecó tác dụng phụ rất không mong muốn, đến mức nó khiến cho việc đánh giá mã gần như không thể (vì hành vi của một dòng nhất định phụ thuộc vào những gì trong ngăn xếp cuộc gọi - nếu một chức năng được gọi trong ngữ cảnh "được kiểm tra", set -ebị vô hiệu hóa cho lời mời đó và mọi thứ nó lần lượt gọi). Xem các bài tập trong BashFAQ # 105 .
Charles Duffy

78

set -x

In một dấu vết của các lệnh đơn giản, cho các lệnh, lệnh case, chọn lệnh và số học cho các lệnh và đối số của chúng hoặc danh sách từ liên quan sau khi chúng được mở rộng và trước khi chúng được thực thi. Giá trị của biến PS4 được mở rộng và giá trị kết quả được in trước lệnh và các đối số mở rộng của nó.

[ nguồn ]

Thí dụ

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

Ví dụ trên minh họa việc sử dụng set -x. Khi nó được sử dụng, biểu thức số học ở trên đã được mở rộng. Chúng ta có thể thấy một dòng singe đã được đánh giá từng bước như thế nào.

  • Bước đầu tiên exprđã được đánh giá.
  • Bước thứ hai echođã được đánh giá.

Để biết thêm về bộ → truy cập liên kết này

khi nói đến kịch bản shell của bạn,

[ "$DEBUG" == 'true' ] && set -x

Tập lệnh của bạn có thể đã in một số dòng thông tin bổ sung khi chế độ thực thi được chọn là DEBUG. Theo truyền thống, mọi người thường sử dụng để bật chế độ gỡ lỗi khi tập lệnh được gọi với đối số tùy chọn, chẳng hạn như-d



6

-u: bị tắt theo mặc định. Khi được kích hoạt, một thông báo lỗi được hiển thị khi sử dụng biến không được định cấu hình.

-v: không hoạt động theo mặc định. Sau khi kích hoạt, nội dung gốc của thông tin sẽ được hiển thị (không có độ phân giải thay đổi) trước khi thông tin được xuất ra.

-x: không hoạt động theo mặc định. Nếu được kích hoạt, nội dung lệnh sẽ được hiển thị trước khi lệnh được chạy (sau khi độ phân giải biến, có ký hiệu ++).

So sánh sự khác biệt sau đây:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
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.