Các kịch bản gỡ lỗi, sự khác biệt giữa -x để đặt đường ống -euxo là gì?


17

Cách chính mà tôi biết để gỡ lỗi các tập lệnh là thêm -xvào shabang ( #!/bin/bash -x).

Gần đây tôi đã bắt gặp một cách mới, thêm set -euxo pipefailngay dưới shabang, như trong:

#!/bin/bash
set -euxo pipefail

Sự khác biệt chính giữa hai cách gỡ lỗi là gì? Có những lúc bạn thích cái này hơn cái kia?

Là sinh viên năm nhất, sau khi đọc ở đây , tôi không thể rút ra kết luận như vậy.

Câu trả lời:


15

Đầu tiên, tôi sợ rằng giải thích về -otùy chọn được cung cấp bởi http://explainshell.com là không hoàn toàn chính xác.

Cho rằng đó setlà một lệnh bắt nạt, chúng ta có thể xem tài liệu của nó bằng helpcách thực hiện help set:

  -o option-name
      Set the variable corresponding to option-name:
          allexport    same as -a
          braceexpand  same as -B
          emacs        use an emacs-style line editing interface
          errexit      same as -e
          errtrace     same as -E
          functrace    same as -T
          hashall      same as -h
          histexpand   same as -H
          history      enable command history
          ignoreeof    the shell will not exit upon reading EOF
          interactive-comments
                       allow comments to appear in interactive commands
          keyword      same as -k
          monitor      same as -m
          noclobber    same as -C
          noexec       same as -n
          noglob       same as -f
          nolog        currently accepted but ignored
          notify       same as -b
          nounset      same as -u
          onecmd       same as -t
          physical     same as -P
          pipefail     the return value of a pipeline is the status of
                       the last command to exit with a non-zero status,
                       or zero if no command exited with a non-zero status
          posix        change the behavior of bash where the default
                       operation differs from the Posix standard to
                       match the standard
          privileged   same as -p
          verbose      same as -v
          vi           use a vi-style line editing interface
          xtrace       same as -x

Như bạn có thể thấy -o pipefailcó nghĩa là:

giá trị trả về của một đường ống là trạng thái của lệnh cuối cùng để thoát với trạng thái khác không hoặc bằng 0 nếu không có lệnh nào thoát với trạng thái khác không

Nhưng nó không nói: Write the current settings of the options to standard output in an unspecified format.

Bây giờ, -xđược sử dụng để gỡ lỗi như bạn đã biết và -esẽ ngừng thực thi sau lỗi đầu tiên trong tập lệnh. Hãy xem xét một kịch bản như thế này:

#!/usr/bin/env bash

set -euxo pipefail
echo hi
non-existent-command
echo bye

Các echo byedòng sẽ không bao giờ được thực thi khi -eđược sử dụng vì non-existent-commandkhông trả lại 0:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found

Nếu không có -edòng cuối cùng sẽ được in vì mặc dù đã xảy ra lỗi, chúng tôi đã không Bashtự động thoát:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye

set -e thường được đặt ở đầu tập lệnh để đảm bảo rằng tập lệnh sẽ bị dừng khi gặp lỗi đầu tiên - ví dụ: nếu tải xuống tệp không thành công, sẽ không có ý nghĩa để giải nén.


Tôi đã đọc câu trả lời nhưng tôi không chắc mình hiểu điều này: Cú pháp bạn khuyên dùng là gì (tôi tin rằng nó hơi khác, như thế này set -uxo pipefail).
JohnDoea

Nếu bạn có nghĩa là set -enó sẽ gây ra sẽ chấm dứt lỗi script. Trong ví dụ của bạn, nó chỉ là một trong nhiều tùy chọn cùng với -uxo pipefail.
Arkadiusz Drabchot

Tôi muốn nói rằng tôi không chắc liệu bạn có gợi ý cho tôi sử dụng hay không sử dụng eđối số.
JohnDoea

1
Nó phụ thuộc vào yêu cầu của bạn. Nó không được đặt theo mặc định, tùy thuộc vào tác giả. Nếu bạn chắc chắn rằng tất cả các lệnh được sử dụng trong tập lệnh sẽ luôn trở lại 0thành công và khác không khi thất bại thì -erất hữu ích nhưng vì mọi thứ khác nên được sử dụng một cách thận trọng.
Arkadiusz Drabchot

1
Bạn có thể mở rộng câu trả lời, giải thích tại sao -u được khuyến nghị trong bối cảnh này không?
Patrice M.
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.