การดีบักสคริปต์ความแตกต่างระหว่าง -x ถึง set -euxo pipefail คืออะไร


17

วิธีหลักที่ฉันรู้ว่าการดีบักสคริปต์คือการเพิ่ม-xไปที่ shabang ( #!/bin/bash -x)

เมื่อเร็ว ๆ นี้ฉันได้พบกับวิธีการใหม่เพิ่มset -euxo pipefailสิทธิใต้ shabang เช่นเดียวกับใน:

#!/bin/bash
set -euxo pipefail

อะไรคือข้อแตกต่างที่สำคัญระหว่างสองวิธีในการดีบัก มีบางครั้งที่คุณอยากได้คนที่เหนือกว่าคนอื่นหรือไม่?

ในฐานะน้องใหม่หลังจากอ่านที่นี่ฉันไม่สามารถแยกข้อสรุปเช่นนั้นได้

คำตอบ:


15

ครั้งแรกฉันกลัวว่าคำอธิบายของ-oตัวเลือกที่เสิร์ฟโดยhttp://explainshell.comนั้นไม่ถูกต้องทั้งหมด

ระบุว่าsetเป็นคำสั่ง bulit ในเราสามารถดูเอกสารของมันด้วยhelpการดำเนินการ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

ตามที่คุณเห็น-o pipefailหมายถึง:

ค่าส่งคืนของไปป์ไลน์คือสถานะของคำสั่งสุดท้ายเพื่อออกโดยมีสถานะไม่เป็นศูนย์หรือเป็นศูนย์หากไม่มีคำสั่งออกจากสถานะไม่เป็นศูนย์

แต่มันไม่ได้พูดว่า: Write the current settings of the options to standard output in an unspecified format.

ตอนนี้-xใช้สำหรับการดีบักตามที่คุณรู้แล้วและ-eจะหยุดการทำงานหลังจากข้อผิดพลาดแรกในสคริปต์ พิจารณาสคริปต์เช่นนี้

#!/usr/bin/env bash

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

echo byeบรรทัดจะไม่ถูกดำเนินการเมื่อ-eถูกนำมาใช้เพราะ non-existent-commandไม่ได้กลับ 0:

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

หากไม่มี-eบรรทัดสุดท้ายจะถูกพิมพ์เพราะแม้ว่าเกิดข้อผิดพลาดเราไม่ได้บอกBashให้ออกโดยอัตโนมัติ:

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

set -e มักจะอยู่ด้านบนสุดของสคริปต์เพื่อให้แน่ใจว่าสคริปต์จะหยุดทำงานเมื่อพบข้อผิดพลาดครั้งแรก - ตัวอย่างเช่นหากการดาวน์โหลดไฟล์ล้มเหลว


ฉันอ่านคำตอบ แต่ฉันไม่แน่ใจว่าจะได้รับสิ่งนี้: ไวยากรณ์ที่คุณแนะนำให้ใช้คืออะไร (ฉันเชื่อว่ามันแตกต่างกันเล็กน้อยเช่นนี้set -uxo pipefail)
JohnDoea

ถ้าคุณหมายความว่าset -eมันจะทำให้เกิดสคริปต์จะยุติข้อผิดพลาด -uxo pipefailในตัวอย่างของคุณมันเป็นเพียงหนึ่งในหลายทางเลือกร่วมกับ
Arkadiusz Drabczyk

ฉันหมายถึงว่าฉันไม่แน่ใจว่าคุณแนะนำให้ฉันใช้หรือไม่ใช้eอาร์กิวเมนต์
JohnDoea

1
มันขึ้นอยู่กับความต้องการของคุณ ไม่ได้ตั้งค่าเริ่มต้นดังนั้นจึงขึ้นอยู่กับผู้แต่ง หากคุณแน่ใจว่าคำสั่งทั้งหมดที่ใช้ในสคริปต์จะกลับมา0สู่ความสำเร็จและไม่เป็นศูนย์เมื่อเกิดข้อผิดพลาด-eแต่ก็มีประโยชน์ แต่อย่างอื่นก็ควรใช้ด้วยความระมัดระวัง
Arkadiusz Drabczyk

1
คุณสามารถขยายคำตอบโดยอธิบายว่าเหตุใดจึงแนะนำให้ -u ในบริบทนี้
Patrice M.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.