เอาต์พุตโดยตรงจากคำสั่งไปยังไฟล์รวมถึงคำสั่งดั้งเดิมและพิมพ์ในเทอร์มินัล


8

เมื่อเรียกใช้การทดสอบฉันต้องเรียกใช้ชุดคำสั่ง มันจะมีประโยชน์มากสำหรับฉันและช่วยฉันได้มากถ้ามีวิธีที่จะทำสิ่งเหล่านี้ทั้งหมด:

  • เรียกใช้คำสั่งที่ฉันต้องการเรียกใช้
  • เปลี่ยนทิศทางเอาต์พุตทั้งหมดจากคำสั่งไปยังไฟล์ที่ระบุ
  • รวมคำสั่งดั้งเดิมในไฟล์ที่ระบุ
  • พิมพ์เอาต์พุตจากคำสั่งดั้งเดิมในเทอร์มินัล

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

มีคนแนะนำสิ่งนี้:

echo "ls -l" | xargs -I{} bash -c "echo >> output.file; eval {} >> output.file"

แต่สิ่งนี้จะไม่พิมพ์เอาต์พุตในเทอร์มินัลหรือรวมคำสั่งดั้งเดิมไว้ในไฟล์

ฉันขอขอบคุณแนวคิดใด ๆ


2
เกือบซ้ำของaskubuntu.com/q/688498/295286
Sergiy Kolodyazhnyy

ฉันไม่พบสิ่งนี้ในการค้นหาของฉัน - ไม่เหมือนกันทั้งหมด แต่อาจจะทำให้ฉันได้รับคำตอบ
shaneoh

ใช่และนี่คือเหตุผลที่ฉันพูดเกือบซ้ำกัน แต่เพื่อที่จะซื่อสัตย์กับความคิดเห็นของฉันอย่างสมบูรณ์แบบคุณสามารถใช้วิธีแก้ปัญหาเกือบทุกอย่างจากที่นั่นและใช้ประโยชน์จากมันteeได้
Sergiy Kolodyazhnyy

คำตอบ:


14

นั่นคือteeคุณกำลังค้นหาสำหรับ

ls -l | tee outfile

พิมพ์เอาต์พุตของls -lไปที่ stdout (เช่นเทอร์มินัล) และบันทึกลงในไฟล์outfileในเวลาเดียวกัน แต่ : มันไม่ได้เขียนชื่อคำสั่งไม่ว่าจะ stdout หรือไปที่ไฟล์ เพื่อให้บรรลุถึงนั้นเพียงแค่echoชื่อคำสั่งก่อนที่จะรันคำสั่งและไพพ์ทั้งสองเอาต์พุตไปที่tee:

( echo "ls -l" && ls -l ) | tee outfile

มันยุ่งยากในการพิมพ์ดังนั้นทำไมไม่กำหนดฟังก์ชั่น?

both(){ ( echo "$@" && "$@" ) | tee outfile ;}

หลังจากนั้นคุณก็สามารถวิ่งได้

both ls -l

เพื่อให้ได้ผลลัพธ์ที่ต้องการ ใส่ฟังก์ชั่นในของคุณ~/.bashrcเพื่อกำหนดไว้ในเทอร์มินัลใหม่ทุกอัน

หากคุณต้องการที่จะสามารถระบุไฟล์ที่ส่งออกเป็นอาร์กิวเมนต์แรกที่ชอบ

both output ls -l

ทำให้มันแทน:

both(){ ( echo "${@:2}" && "${@:2}" ) | tee "$1" ;}

หากคุณไม่ต้องการไฟล์ที่ส่งออกที่จะถูกเขียนทับ แต่ผนวกกับมันเพิ่มตัวเลือกในการ-atee


9

คุณสามารถใช้ประโยชน์จากscriptคำสั่งซึ่งจะทำให้ไฟล์ typescript ของทุกสิ่งที่พิมพ์ไปยังสถานีของคุณ มันสร้างเชลล์ที่มีการแยกและจะบันทึกทุกอย่างจนกว่าเชลล์นั้นจะออก

$ script my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
Script done on Tue 28 Nov 2017 09:46:27 AM UTC

ถ้าฉันcat my_outputได้ผลลัพธ์เดียวกัน:

$ cat my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
exit

Script done on Tue 28 Nov 2017 09:46:27 AM UTC

6

คุณสามารถใช้ฟังก์ชันการดีบักของเชลล์พร้อมกับtee:

( set -x; command1 args...; command2 args ) 2>&1 | tee output.log
  • ( ... )เริ่ม sub-shell ซึ่งอนุญาตให้คุณ“ รวบรวม” สตรีมเอาต์พุตของคำสั่งทั้งหมดที่ดำเนินการภายใน sub-shell นอกจากนี้ยังมีผลกระทบของsetคำสั่งด้านล่างนี้ไปยังเปลือกย่อย

  • set -xเปิดใช้งานxตัวเลือกเชลล์ที่พิมพ์คำสั่งทั้งหมดที่เชลล์รันไปยังสตรีมข้อผิดพลาดมาตรฐานก่อนเรียกใช้

  • 2>&1 เปลี่ยนเส้นทางสตรีม 2 (ข้อผิดพลาดมาตรฐาน) ไปยังสตรีม 1 (เอาต์พุตมาตรฐาน)

  • | เปลี่ยนเส้นทางสตรีมเอาต์พุตมาตรฐานของคำสั่งซ้ายไปยังสตรีมอินพุตมาตรฐานของคำสั่งที่ถูกต้อง

  • tee FILEคัดลอกสตรีมอินพุตมาตรฐานไปยังไฟล์FILEและไปยังเอาต์พุตมาตรฐาน

หากลำดับคำสั่งของคุณอยู่ในไฟล์สคริปต์แล้วจะทำให้การเรียกใช้เป็นดังนี้:

bash -x /path/to/script args... 2>&1 | tee output.log
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.