วิธีเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์บันทึกหลายไฟล์? ต่อไปนี้ใช้ไม่ได้:
some_command 1> output_log_1 output_log_2 2>&1
วิธีเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์บันทึกหลายไฟล์? ต่อไปนี้ใช้ไม่ได้:
some_command 1> output_log_1 output_log_2 2>&1
คำตอบ:
ดูman tee
:
ชื่อ: ที - อ่านจากอินพุตมาตรฐานและเขียนไปยังเอาต์พุตและไฟล์มาตรฐาน
เรื่องย่อ: ที [ตัวเลือก] ... [ไฟล์] ...
ดังนั้น:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2
ฉันพยายามเรียกใช้งานดังกล่าวข้างต้น แต่ฉันต้องกด ctrl-c เพื่อเปลี่ยนเส้นทางไปยังไฟล์บันทึกที่สอง ยังมีการพิมพ์ผลลัพธ์บนคอนโซล ฉันต้องการให้เปลี่ยนเส้นทางคำสั่งไปยังบันทึก แต่ไม่ได้อยู่ในคอนโซล ความช่วยเหลือใด ๆ ที่มีความนิยม
tee
คำสั่งเขียนstdin
ไปยังแฟ้ม (s) และยังstdout
จะ หากคุณไม่ต้องการให้เอาต์พุตปรากฏบนเทอร์มินัลคุณต้องเปลี่ยนเส้นทางไป/dev/null
ตามปกติ
echo test | tee --append file1 file2
สมมติว่าเอาต์พุตของคุณสร้างจากฟังก์ชันcmd()
:
cmd() {
echo hello world!
}
ในการเปลี่ยนทิศทางเอาต์พุตจากcmd
ไฟล์สองไฟล์ แต่ไม่ใช่ไปยังคอนโซลคุณสามารถใช้:
cmd | tee file1 file2 >/dev/null
วิธีนี้จะใช้งานได้กับหลาย ๆ ไฟล์กำหนดให้แหล่งข้อมูลใด ๆ
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
สิ่งนี้จะได้ผล:
echo $(cmd) | tee file1 file2 >/dev/null
หากไม่มีการ/dev/null
เปลี่ยนเส้นทาง tee จะส่งเอาต์พุตไปยัง stdout นอกเหนือจากไฟล์ที่ระบุ
ตัวอย่างเช่นหากสิ่งนี้ถูกเรียกใช้จากคอนโซลคุณจะเห็นผลลัพธ์ที่นั่น เรียกใช้จาก crontab ผลลัพธ์จะปรากฏข้อความสถานะที่ส่งถึงคุณ (ดูคำตอบของ Gilles ได้ที่นี่https://unix.stackexchange.com/a/100833/3998 )
สิ่งนี้ใช้ได้กับฉันในการทุบตีบน Ubuntu 12.04 และได้รับการยืนยันใน Ubuntu 14.04 โดยใช้ GNU bash 4.3.11 (1) ดังนั้นจึงควรใช้กับ GNU ทุบตีรุ่นล่าสุด
version 4.3.11(1)-release (i686-pc-linux-gnu)
) ใน Ubuntu 14.04
มันเป็นโพสต์เก่า แต่ฉันเพิ่งพบตอนนี้ ...
แทนที่จะเปลี่ยนเส้นทางผลลัพธ์ไปที่> /dev/null
คุณสามารถเปลี่ยนเส้นทางไปยังไฟล์สุดท้าย:
echo "foobarbaz" | tee file1 > file2
หรือสำหรับการผนวกเอาต์พุต:
echo "foobarbaz" | tee -a file1 >> file2
-a
ในที)
ดังที่ @jofel พูดถึงในความคิดเห็นภายใต้คำตอบสิ่งนี้สามารถทำได้ในzsh
:
echo foobar >file1 >file2 >file3
หรือด้วยการขยายรั้ง:
echo foobar >file{1..3}
ภายในนี้ทำงานคล้ายกับtee
คำตอบที่ให้ไว้ข้างต้น เชลล์เชื่อมต่อ stdout ของคำสั่งกับกระบวนการที่ไพพ์ไปยังหลายไฟล์ จึงมีไม่ได้เปรียบทางด้านเทคนิคใด ๆ ที่น่าสนใจที่จะทำมันด้วยวิธีนี้ ( แต่ก็ไม่ดูดีจริง) ดูคู่มือการหาข้อมูลเพิ่มเติมzsh
อย่างไรก็ตามไม่สามารถแสดงความคิดเห็นได้อีกวิธีหนึ่งในการแสดง
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
อาจทำให้เรื่องนี้ง่ายขึ้นเมื่อจัดการกับไฟล์จำนวนมาก
echo "foobarbaz" | tee file{1..8} > /dev/null
file1
ผ่านfile8
เป็นชื่อของพวกเขาและผู้ที่มีแนวโน้มที่จะยึดตำแหน่งเพียงตัวอย่างสำหรับชื่อของไฟล์
zsh
some_command >output_log_1 >output_log_2