วิธีการเปลี่ยนเส้นทาง stderr และ stdout ไปยังไฟล์ต่าง ๆ ในบรรทัดเดียวกันในสคริปต์?


180

ฉันรู้สิ่งนี้มาก:

$ command 2>> error

$ command 1>> output

มีวิธีใดบ้างที่ฉันสามารถส่งออก stderr ไปยังไฟล์ข้อผิดพลาดและเอาต์พุต stdout ไปยังไฟล์เอาต์พุตใน bash บรรทัดเดียวกัน?

คำตอบ:


292

เพียงเพิ่มเข้าไปในบรรทัดเดียว command 2>> error 1>> output

อย่างไรก็ตามโปรดทราบว่า>>การต่อท้ายหากไฟล์มีข้อมูลอยู่แล้ว ในขณะเดียวกัน>จะเขียนทับข้อมูลที่มีอยู่ในไฟล์

ดังนั้นcommand 2> error 1> outputหากคุณไม่ต้องการผนวก

เพียงเพื่อประโยชน์ในการเสร็จสิ้นของคุณสามารถเขียน1>เป็นเพียง>ตั้งแต่บ่งแฟ้มเริ่มต้นคือการส่งออก ดังนั้น1>และ>เป็นสิ่งเดียวกัน

ดังนั้นcommand 2> error 1> outputกลายเป็นcommand 2> error > output


3
คำตอบที่ดี! ฉันชอบคำอธิบายของคุณว่า1>สามารถเขียนเป็นอย่างไร>
user784637

command &2>err.logฉันคิดว่าฉันแตกต่างจากซินแทกซี่อย่างสิ้นเชิง (เชื่อมโยงไปยังคำตอบที่เหมาะสมของทุกทุบตีท่อ ISMS อาจจะอยู่ในลำดับ)
ThorSummoner

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.htmlเป็นสิ่งที่ฉันคิดว่าคุณกำลังมองหา ดูเหมือนว่าcommand &2>err.logไม่ถูกต้องนัก - เครื่องหมายและในไวยากรณ์นั้นใช้สำหรับอธิบายไฟล์เป็นเป้าหมายเช่นcommand 1>&2เปลี่ยนเส้นทาง stdout เป็น stderr
DreadPirateShawn

@DreadPirateShawn โปรดอย่าเชื่อมโยง ABS เป็นข้อมูลอ้างอิง - บางครั้งมันมีความไม่ถูกต้องทันทีและบ่อยครั้งมีตัวอย่างที่ไม่ดี wiki.bash-hackers.org/howto/redirection_tutorialเป็นไกลอ้างอิงแหล่งที่ดีขึ้นในการเปลี่ยนเส้นทาง
Charles Duffy

27

ลองสิ่งนี้:

your_command 2>stderr.log 1>stdout.log

ข้อมูลมากกว่านี้

ตัวเลข0ผ่าน9เป็นไฟล์อธิบายในทุบตี 0ย่อมาจากอินพุตมาตรฐาน1หมายถึงเอาต์พุตมาตรฐาน2ย่อมาจากข้อผิดพลาดมาตรฐาน 3ผ่าน9มีไว้สำหรับการใช้งานชั่วคราวอื่น ๆ

อธิบายไฟล์ใด ๆ >ที่สามารถเปลี่ยนเส้นทางไปยังไฟล์หรืออธิบายไฟล์อื่นโดยใช้ผู้ประกอบการ คุณสามารถใช้โอเปอเรเตอร์>>เพื่อต่อท้ายไฟล์แทนการสร้างไฟล์เปล่า

การใช้งาน:

file_descriptor > filename

file_descriptor > &file_descriptor

โปรดดูที่ขั้นสูงทุบตี Scripting Guide: บทที่ 20. I / O เปลี่ยนเส้นทาง


Thanks.i ค้นหาสิ่งนี้เป็นเวลาหนึ่งชั่วโมง
dılosürücü


9

หรือถ้าคุณต้องการที่จะผสมเอาต์พุต (stdout & stderr) ในไฟล์เดียวคุณอาจต้องการใช้:

command > merged-output.txt 2>&1

32
นี่ไม่ใช่คำตอบสำหรับคำถาม
Matthias

เหตุใดผู้คนจึงรวมเอาท์พุทหรือแนะนำการรวมเอาท์พุท
nurettin

@nurettin: บางทีคุณมีบรรทัดสคริปต์ที่เพิ่งดำเนินการคำสั่งและบันทึกผลลัพธ์ไปยังล็อกไฟล์ทันที คำสั่งที่เป็นปัญหาอาจล้มเหลวในบางครั้งดังนั้นคุณต้องการบันทึกข้อผิดพลาดเกี่ยวกับสิ่งนั้นด้วย แต่ไปยังไฟล์บันทึกเดียวกัน
streamofstars

@ streamofstars ใช่แน่นอนคุณอาจจะบางครั้งนั่นคือสิ่งที่ผู้คนต้องการฉันแสดงความคิดเห็นในบริบทของคำถามนี้ในฐานะคนที่กำลังหาคำตอบและพบคนจำนวนมากที่ไม่เกี่ยวข้องทั้งหมดใน stackoverflow
nurettin

0

สามารถเปลี่ยนเส้นทางเอาต์พุตคำสั่งหลายคำสั่งได้ สิ่งนี้ใช้ได้กับทั้งบรรทัดคำสั่งหรือมีประโยชน์มากที่สุดในสคริปต์ทุบตี -sชี้นำสอบถามรหัสผ่านไปที่หน้าจอ

Hereblock cmds stdout / stderr ถูกส่งไปยังไฟล์ที่แยกออกจากกันและไม่มีอะไรให้แสดง

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr จะถูกส่งไปยังไฟล์เดียวและแสดงผล

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmds stdout / stderr ถูกส่งไปยังไฟล์แยกกันและ stdout เพื่อแสดง

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

รหัสผ่านอาจขึ้นอยู่กับว่าคุณเป็นใคร (whoami) และชื่อผู้ใช้

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