`set -x` ทำอะไร


260

ฉันมีเชลล์สคริปต์ที่มีบรรทัดต่อไปนี้:

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

15
ลองดู:help -m set | less
Cyrus

4
ขอบคุณสำหรับhelp -m setเคล็ดลับ ที่ได้ผล ฉันพยายามman setก่อนที่จะถาม แต่ใน Ubuntu มีNo manual entry for set
โอเล

2
@Ole setถูกสร้างขึ้นในทุบตีดังนั้นหากman bashคุณสามารถหาได้ในส่วนคำสั่งเชลล์อาคาร เมื่อดูหน้าคนที่คุณอาจจะสามารถข้ามไปได้โดยการค้นหาสำหรับ regexp \bset \[นี้:
User5910

คำตอบ:


364

set -xเปิดใช้งานโหมดของเชลล์ที่พิมพ์คำสั่งที่เรียกใช้งานทั้งหมดไปยังเทอร์มินัล ในกรณีของคุณจะใช้สำหรับการดีบักอย่างชัดเจนซึ่งเป็นกรณีการใช้งานทั่วไปสำหรับset -x: การพิมพ์ทุกคำสั่งที่ถูกเรียกใช้อาจช่วยให้คุณเห็นภาพการควบคุมการทำงานของสคริปต์หากไม่สามารถทำงานได้อย่างที่คาดไว้

set +x ปิดการใช้งานมัน


5
จะปิดการใช้งานฟีเจอร์นั้นอีกครั้งได้อย่างไร?
feedc0de

85
@DanielBrunner: set +xปิดการใช้งาน
John Zwinck

2
มันมีประโยชน์มาก! ฉันหวังว่าจะมีคนบอกฉันก่อนหน้านี้ มีเทคนิคที่น่าสนใจอื่น ๆ เช่นนี้ที่สามารถยกระดับทักษะเมตาของเราในการเขียนสคริปต์หรือไม่?
นักเรียน

7
@ นักเรียน: set -eที่ด้านบนสุดของสคริปต์ของคุณจะทำให้สคริปต์ออกโดยมีข้อผิดพลาดทุกครั้งที่เกิดข้อผิดพลาด (และไม่มีการจัดการอย่างชัดเจน) ฉันพบว่าเป็นที่นิยมอย่างมากในการเริ่มต้นซึ่งจะทำให้จำใจ (เช่น Visual Basic ของเสียชื่อOn Error Resume Next)
John Zwinck

1
@JohnZwinck โชคไม่ดีset -eมีมากผลข้างเคียงที่ไม่พึงประสงค์ไปยังจุดที่มันทำให้การตรวจสอบรหัสเกือบเป็นไปไม่ได้ (เพราะพฤติกรรมบรรทัดการกำหนดขึ้นอยู่กับสิ่งที่เกิดขึ้นเรียกกอง - ถ้าฟังก์ชั่นที่เรียกว่าใน "การตรวจสอบ" บริบทset -eถูกปิดใช้งาน สำหรับการภาวนานั้นและทุกอย่างที่เกิดขึ้นก็จะเป็นการโทร) ดูการออกกำลังกายในBashFAQ #
ชาร์ลส์ดัฟฟี่

78

set -x

พิมพ์การติดตามของคำสั่งง่าย ๆ สำหรับคำสั่งคำสั่ง case เลือกคำสั่งและเลขคณิตสำหรับคำสั่งและอาร์กิวเมนต์หรือรายการคำที่เกี่ยวข้องหลังจากที่ถูกขยายและก่อนที่จะถูกเรียกใช้งาน ค่าของตัวแปร PS4 ถูกขยายและค่าผลลัพธ์จะถูกพิมพ์ก่อนคำสั่งและอาร์กิวเมนต์ที่ขยายเพิ่ม

[ แหล่งที่มา ]

ตัวอย่าง

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

set +x
echo `expr 10 + 20 `
30

set -xตัวอย่างข้างต้นแสดงให้เห็นถึงการใช้งานของ เมื่อมีการใช้งานนิพจน์ทางคณิตศาสตร์ด้านบนจะได้รับการขยาย เราจะได้เห็นว่าการประเมินบรรทัดทีละขั้นเป็นอย่างไร

  • ขั้นตอนแรกexprได้รับการประเมิน
  • ขั้นตอนที่สองechoได้รับการประเมิน

หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ set →เยี่ยมชมลิงค์นี้

เมื่อพูดถึงเชลล์สคริปต์ของคุณ

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

DEBUGสคริปต์ของคุณอาจจะได้รับการพิมพ์บรรทัดเพิ่มเติมบางส่วนของข้อมูลเมื่อโหมดการดำเนินการคัดเลือกให้เป็น คนที่เคยใช้เพื่อเปิดใช้งานโหมดการแก้ปัญหาเมื่อสคริปต์เรียกว่ามีตัวเลือกอาร์กิวเมนต์เช่น-d


3
คำพูดนี้มาจากgnu.org/software/bash/manual/html_node/The-Set-Builtin.html
Fabien

6

-u: ปิดใช้งานโดยค่าเริ่มต้น เมื่อเปิดใช้งานข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นเมื่อใช้ตัวแปรที่ไม่ได้กำหนดค่า

-v: ไม่ได้ใช้งานโดยค่าเริ่มต้น หลังจากเปิดใช้งานเนื้อหาต้นฉบับของข้อมูลจะปรากฏขึ้น (ไม่มีความละเอียดตัวแปร) ก่อนที่ข้อมูลจะถูกส่งออก

-x: ไม่ได้ใช้งานโดยค่าเริ่มต้น หากเปิดใช้งานเนื้อหาคำสั่งจะปรากฏขึ้นก่อนที่คำสั่งจะทำงาน (หลังจากความละเอียดตัวแปรมีสัญลักษณ์ ++)

เปรียบเทียบความแตกต่างดังต่อไปนี้:

/ # 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.