ส่งสำเนาของเอาต์พุตสคริปต์ไปยังไฟล์


10

สมมติว่าฉันมีสคริปต์ Zsh และฉันต้องการให้มันพิมพ์ผลลัพธ์ไปSTDOUTยัง แต่ก็คัดลอก (ดัมพ์) เอาต์พุตไปยังไฟล์ในดิสก์

ยิ่งกว่านั้นสคริปต์เริ่มต้นด้วยตัวเลือกต่อไปนี้

set -o xtrace

ซึ่งบังคับให้มันเป็น verbose และพิมพ์คำสั่งที่มันทำงาน ฉันต้องการที่จะจับเอาท์พุทนี้เช่นกันในไฟล์ในดิสก์

ความเข้าใจของฉันคือถ้าฉันทำ

./my_script.sh > log.txt

มันจะส่งSTDOUTไปlog.txtแต่ถ้าฉันต้องการที่จะเห็นเอาท์พุทใน terminal?

ฉันได้อ่านเกี่ยวกับteeและMULTIOSตัวเลือกใน zsh แต่ฉันไม่แน่ใจว่าจะใช้พวกเขา

เมื่อฉันทำ:

./my_script | tee log.txt

ฉันสามารถเห็นผลลัพธ์บนเทอร์มินัล แต่ไฟล์ไม่log.txtเห็นว่าจะจับทุกอย่าง (อันที่จริงมันเก็บแทบทุกอย่าง)


./my_script.sh > log.txt 2>&1
mikeserv

ดูเหมือนว่าคุณกำลังมองหาscriptคำสั่ง หรืออาจเป็นmyscript >&1 > log.txt 2>&1
Stéphane Chazelas

คำตอบ:


12

อาจเป็นไปได้ว่าสคริปต์ของคุณกำลังสร้างเอาต์พุตstdoutและstderrและคุณได้รับหนึ่งในสตรีมเอาต์พุตเหล่านั้นไปยังล็อกไฟล์ของคุณ

./my_script.sh | tee log.txtจะส่งออกทุกอย่างไปยังเทอร์มินัล แต่จะถ่ายโอนข้อมูลstdoutไปที่ logfile

./my_script.sh > log.txt 2>&1 จะทำสิ่งที่ตรงกันข้ามโดยทิ้งทุกอย่างไปยังล็อกไฟล์ แต่ไม่แสดงอะไรบนหน้าจอ

เคล็ดลับคือการรวมสองกับtee:

./myscript.sh 2>&1 | tee log.txt

การเปลี่ยนเส้นทางนี้stderr( 2) ลงในstdout( 1) แล้วท่อstdoutเข้าไปteeซึ่งคัดลอกไปยังสถานีและไปยังแฟ้มบันทึก

zshเทียบเท่า multios จะเป็น:

./myscript.sh >&1 > log.txt 2>&1

นั่นคือเปลี่ยนเส้นทาง stdout ทั้งสองไปยัง stdout ดั้งเดิมและ log.txt (ภายในผ่านทางไพพ์ไปยังบางสิ่งที่ใช้งานได้tee) จากนั้นเปลี่ยนเส้นทาง stderr ไปยังสิ่งนั้นเช่นกัน (ไปยังteeไพพ์ไปยังกระบวนการเหมือนภายใน)


ขอบคุณ - เกี่ยวกับบรรทัดสุดท้ายของคุณทำไมไม่./myscript.sh >&1 2>&1 > log.txt? (เช่นการเปลี่ยนลำดับของการเปลี่ยนเส้นทางสองครั้งล่าสุด) จะมีความแตกต่างระหว่างพวกเขาหรือไม่?
Amelio Vazquez-Reina

ตัวแปรของคุณไม่ได้ส่งออกไปยังเพียงเพื่อstdout log.txtบรรทัดสุดท้ายในคำตอบ (เพิ่มโดย @ StéphaneChazelasและไม่ใช่ตัวฉันเอง) จะแสดงผลลัพธ์ให้ทั้งคู่
savanto

0

nohup อนุญาตให้งานดำเนินการต่อไปแม้ว่าคอนโซลจะตายหรือถูกปิดซึ่งมีประโยชน์สำหรับการสำรองข้อมูลที่ยาวนาน ฯลฯ แต่ที่นี่เรากำลังใช้การบันทึกอัตโนมัติ

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