วิธีสร้างสคริปต์ทุบตีพิมพ์ทุกคำสั่งก่อนที่จะดำเนินการ?


88

ตัวอย่างเช่นฉันมีไฟล์ทุบตีง่าย

#!/bin/bash
cd ~/hello
ls

ฉันจะทำให้มันแสดงทุกคำสั่งก่อนดำเนินการได้อย่างไร เพียงผลตรงข้ามของ "@echo off" ในการเขียนสคริปต์ชุด windows


1
สำหรับผู้ที่มองหาสิ่งที่เป็นsetตัวเลือกที่คุณสามารถพบพวกเขาในหน้าผู้ชายคนนี้
mkobit

คุณสามารถขยายรูปแบบเช่นนี้ได้#!/bin/bash -x
sobi3ch

คำตอบ:


110
bash -x script

หรือ

set -x

ในสคริปต์

set +xคุณสามารถล้างค่าตัวเลือกอีกครั้งกับ หากคุณต้องการทำเพียงไม่กี่คำสั่งคุณสามารถใช้ subshell: `(set -x; command1; command; ... ;)


ฉันใช้สิ่งนี้เพื่อผลที่ยอดเยี่ยมเสมอ ผลลัพธ์ดูสกปรกกว่าที่คุณคิดไว้เล็กน้อย
Scott Pack

2
โดยการตั้งค่าที่คุณสามารถปรับแต่งพรอมต์ของPS4 -xเช่น: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( dateจะทำให้ช้าลง)
Walter Tross

23

สิ่งเหล่านี้ยังใช้งานได้:

set -v

หรือ

#!/bin/bash -v

แต่ -v ไม่ได้พิมพ์สตริง PS4 ก่อนสคริปต์แต่ละบรรทัดและจะไม่ติดตามขั้นตอนของคำสั่ง "for" (ตัวอย่าง) แยกทีละรายการ มันจะสะท้อนความคิดเห็นในขณะที่ -x ไม่ได้

นี่คือตัวอย่างของเอาต์พุตโดยใช้ -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

นี่คือผลลัพธ์ของสคริปต์เดียวกันกับ -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

โปรดทราบว่าฉันรวม "echo -n" เพื่อเพิ่มการเน้นไปที่ความแตกต่างระหว่าง -v และ -x นอกจากนี้ -v ก็เหมือนกับ "-o verbose" แต่ตัวหลังดูเหมือนจะไม่ทำงานเป็นส่วนหนึ่งของ shebang


คำอธิบายที่ดี! โดยไม่ต้องทำการวิจัยใด ๆ ดูเหมือนว่าฉันจะ Verbose และ eXplicit เป็นตัวอักษรสองตัวนั้น
Ape-inago

ฉันคิดว่า -x ใกล้เคียงกับ eXecute มากขึ้น
Steven Parkes



4

set -o xtraceและset +o xtraceเป็นเพื่อนของคุณ (มันเป็น verbose มากกว่า-o verboseและผลลัพธ์จะไปที่ STDERR ซึ่งตรงข้ามกับ verbose ซึ่งดูเหมือนว่าจะเข้าสู่ STDOUT)

ดูเคล็ดลับเพิ่มเติมได้ที่นี่


3

มีสองสามวิธี

#!/usr/bin/env bash -x

ในฐานะที่เป็นสาย shebang

การรวมset -xในสคริปต์เองจะเปิดใช้งานฟังก์ชันในขณะที่set +xจะปิดใช้งาน วิธีการทั้งสองนี้จะทำงานกับเปลือกแบบพกพามากขึ้น

ถ้าฉันจำได้อย่างถูกต้อง Perl ยังมีตัวเลือก -x


1

ไปเหมือน

language -x script

ภาษา = python, perl, bash -x = โอเปอเรเตอร์สคริปต์ = ชื่อไฟล์

หวังว่ามันจะช่วย


3
-xไม่มีอะไรเกี่ยวข้องกับการสะท้อนใน Python
Eugene Pankov

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