ฉันจะทำให้ "bash -x" (โหมดแก้ไขข้อบกพร่อง) recurse ในสคริปต์ที่มาได้อย่างไร


10

ฉันพยายามที่จะดีบักสิ่งที่ทุบตีในการเริ่มต้นเข้าสู่ระบบสำหรับ Linux ฉันได้อ่านแล้วว่า "bash -x" จะทำให้ bash พิมพ์สิ่งที่มันกำลังทำอยู่ แต่ไม่ได้พิมพ์คำสั่งในไฟล์ที่มาเช่น "set -x" ฉันไม่สามารถใช้ "set -x" เพราะการเริ่มต้นทำงานก่อนที่ฉันจะเรียกมันว่า "bash -x" ดูเหมือนว่าจะสามารถใช้งานได้ดีกับ OS X แต่อาจเป็นเพราะรุ่นทุบตี

Linux: 3.2.25

OS X: 3.2.48

นี่คือข้อความที่ตัดตอนมาจากพฤติกรรมที่ไม่เกิดขึ้นซ้ำบน Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

สังเกตว่า /etc/profile.d/vim.sh มีที่มาอย่างไร แต่คำสั่งนั้นจะไม่ถูกพิมพ์ มีวิธีแก้ปัญหาโดยไม่ทำการอัพเกรดหรือไม่? สิ่งนี้เกิดจากความแตกต่างของเวอร์ชั่นหรือไม่?

คำตอบ:


1

set -xบางแห่งในไฟล์รูท (ไฟล์ที่ต้องการไฟล์อื่นทั้งหมด) ควรใช้งานได้ ผลัดกันแนะนำสิ่งที่ต้องการในแต่ละไฟล์และเรียกด้วย[[ !-z "$DEBUG" ]] && set -xDEBUG=1 script.sh


ไฟล์รูทอยู่ที่ไหน? มันเป็นแพลตฟอร์มอิสระ
เคลวิน

ด้วย "ไฟล์รูท" ฉันหมายถึงไฟล์ที่คุณกำลังเรียกหาเชลล์และมันกำลังนำเข้าไฟล์อื่น ๆ ในตัวอย่างของฉันไฟล์รูทจะเป็น script.sh
mkaito

1
แต่การเริ่มต้นเข้าสู่ระบบ bash เกิดขึ้นก่อนที่สคริปต์จะทำงาน สายเกินไปที่จะเรียกใช้ "set -x" ในสคริปต์ ลองด้วยตัวคุณเอง - รัน "bash -l -x script.sh" คุณจะเห็นสิ่งต่าง ๆ เกิดขึ้นก่อนที่คำสั่งของสคริปต์จะทำงาน
เคลวิน

ทำไมบนโลกที่คุณจะเรียกใช้สคริปต์ด้วยbash -l? นั่นมีไว้สำหรับเชลล์แบบโต้ตอบ สคริปต์ไม่ใช่เชลล์แบบโต้ตอบ
mkaito

3
โปรดเปิดกว้างหน่อย - เห็นได้ชัดว่าผู้สร้างทุบตีคิดว่ามันจะมีประโยชน์ ฉันเห็นการใช้งาน 2 ครั้ง (อย่างน้อย): 1) คุณต้องการเรียกใช้ssh user@host 'bash -l -c command'เพื่อให้คุณโหลด env ที่เหมาะสม 2) คุณเป็นผู้ดูแลระบบและต้องการแก้ไขสิ่งที่สคริปต์ init กำลังทำอยู่ก่อนที่สคริปต์ของคุณจะทำงาน - bash -l -xจะแสดงให้คุณเห็น บางครั้งคุณต้องการทราบว่าตัวแปร env ถูกตั้งค่าไว้ที่ใด
เคลวิน

0

เนื่องจากคุณกำลังจัดหาสคริปต์และไม่ได้ดำเนินการคำสั่งแรกของคุณในสคริปต์หลักควรเป็น "set -x"

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

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