มีวิธีง่าย ๆ ในการบันทึกกิจกรรมทั้งหมดที่เชลล์สคริปต์ทำหรือไม่?


18

มีวิธีง่าย ๆ ในการบันทึกกิจกรรมทั้งหมดที่เกิดขึ้นจากเชลล์สคริปต์ไปยังไฟล์หรือไม่?

ฉันมีสคริปต์ มันแสดงผลสิ่งต่าง ๆ เช่น "คำแนะนำ" echo เช่นเดียวกับผลลัพธ์ของโปรแกรมอื่น ๆ ฉันรู้คำสั่ง:

command | tee -a "$log_file"

และ

command >> logifle.log

สิ่งที่ฉันถามคือมีพารามิเตอร์เชลล์สำหรับการบันทึกหรือคำสั่ง set ที่ฉันสามารถใช้ได้หรืออะไรทำนองนั้น ฉันไม่ต้องการเพิ่มการเปลี่ยนเส้นทางหรือทีออฟลงไฟล์หลายสิบครั้งหากฉันไม่จำเป็นต้องทำ ฉันยังต้องการรับเอาต์พุต std ด้วย - ฉันแค่ต้องการให้บันทึกด้วย :wq


5
LOL,: wq เหมือนฉันอยู่ในกลุ่ม '
j0h

1
มันกวนใจฉันว่าคนส่วนใหญ่ดูเหมือนจะทำอย่างนั้นแทน: x
ขอโทษและคืนสถานะให้โมนิก้า

คำตอบ:


18

ถ้าปกติคุณเรียกใช้สคริปต์ของคุณด้วยfoo.shลองเรียกใช้ (สมมติว่ามันเป็นสคริปต์ทุบตี) bash -x foo.shด้วย หากคุณต้องการให้ทุกอย่างเปลี่ยนเส้นทางไปยังไฟล์ลองbash -x foo.sh > file.log 2>&1(โปรดทราบว่าฉันเปลี่ยนเส้นทาง stderr ด้วยให้ลบ2>&1หากคุณไม่ต้องการสิ่งนี้) หากคุณต้องการดูว่าเกิดอะไรbash -x foo.sh 2>&1 | tee log.fileขึ้น


20

มีวิธีที่ง่ายและสะดวก:

การใช้scriptเพื่อสร้าง typescript ของเทอร์มินัลเซสชัน

  1. เริ่มคำสั่ง script

    ถ้าอาร์กิวเมนต์fileจะได้รับเช่นscript ~/tmp/output, scriptบันทึกการสนทนาในไฟล์นี้ หากไม่ได้กำหนดชื่อไฟล์ไว้กล่องโต้ตอบจะถูกบันทึกในไฟล์typescript

  2. เริ่มต้นสคริปต์ของคุณหรือสิ่งที่คุณต้องการเริ่ม

  3. หากสคริปต์ของคุณเสร็จสิ้นหยุดscriptผ่านCtrl-D

  4. ตรวจสอบผลลัพธ์ในไฟล์เอาต์พุตเริ่มต้น typescript


ในการเริ่มต้นคำสั่งของคุณในขั้นตอนเดียวscriptให้ใช้พารามิเตอร์-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

การใช้งานscriptภายในสคริปต์ของคุณไม่สมเหตุสมผลเพราะscriptใช้เชลล์หรือเริ่มเชลล์ใหม่

หากตัวแปร SHELL มีอยู่เชลล์จะแยกโดยสคริปต์จะเป็นเชลล์นั้น หากไม่ได้ตั้งค่า SHELL เชลล์ Bourne จะถูกใช้ (กระสุนส่วนใหญ่ตั้งค่าตัวแปรนี้โดยอัตโนมัติ)


4
@ Fabby ฉันชอบคำตอบของฉัน แต่ฉันไม่เห็นสิ่งที่สีเทาเล็ก ๆ น้อย ๆ ;)
AB

ฉันใช้script logfilenameดังนั้นฉันจะไปรับมัน
waltinator

ฉันจะเรียก "script" จากโปรแกรมเชลล์ได้อย่างไร
j0h

1
ไม่สมเหตุสมผลลองดูคำตอบที่ดีขึ้นของฉัน
AB

1
+1 ขอบคุณสำหรับคำตอบนี้ :-) scriptนอกจากนี้ยังมีประโยชน์ในการติดตามผ่านทาง Fifo จากman script: " -f, --flushล้างข้อมูลออกหลังจากการเขียนแต่ละครั้งนี่เป็นสิ่งที่ดีสำหรับการสื่อสารทางไกล: คนคนหนึ่งทำได้mkfifo foo; script -f fooและอีกคนสามารถควบคุมการใช้งานแบบเรียลไทม์ได้cat foo" นอกจากนี้ยังสามารถใช้ในการตรวจสอบเมื่อโปรแกรมกำลังรอการป้อนข้อมูลหรือทำตัวอย่างเช่นโดยการตรวจสอบการประทับเวลาของ Fifo
sudodus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.