เปลี่ยนเส้นทางทั้ง stderr และ stdout เป็น / dev / null ด้วย / bin / sh


61

ฉันได้ลองทุกวิธีเพื่อเปลี่ยนเส้นทางทั้งไปstdoutและไม่ประสบความสำเร็จ ผมมีเกือบทั้งทุบตีชีวิตการทำงานของฉันที่ฉันไม่เคยมีปัญหานี้ด้วย แต่เป็นครั้งแรกใน BSD ฉันติดอยู่กับstderr/dev/null/bin/sh

สิ่งที่ฉันได้ลอง:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... ซึ่งใช้งานได้; ถ้า Python ไม่มีอยู่มันจะปิดข้อความแสดงข้อผิดพลาดจาก ls อย่างไรก็ตามถ้าpython.tgzมีอยู่บรรทัดที่มีเอาต์พุตซึ่งมีลักษณะดังนี้:

# ./test.sh
./python-2.7.3p1.tgz

ฉันได้ลองแล้ว:

if ls ./python* &> /dev/null; then
    echo found Python
fi

และ

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

และ

if ls ./python* > /dev/null; then
    echo found Python
fi

ไม่มีอะไรได้ผลจริงๆ ฉันสามารถเปลี่ยนเส้นทางหนึ่งในผลลัพธ์ไม่ใช่ทั้งสองอย่างในเวลาเดียวกัน

คำตอบ:


102

สิ่งนี้จะทำงานในเชลล์ที่รองรับ Posix:

ls good bad >/dev/null 2>&1

คุณต้องเปลี่ยนเส้นทาง stdout แรกก่อนที่จะทำซ้ำมันเข้าไปใน stderr ; ถ้าคุณทำซ้ำก่อน stderr จะชี้ไปที่ stdout ที่ชี้ไป

Bash , zsh และ shell อื่น ๆ ก็มีทางลัดเช่นกัน

ls good bad &>/dev/null

ซึ่งสะดวกในบรรทัดคำสั่ง แต่ควรหลีกเลี่ยงในสคริปต์ที่มีวัตถุประสงค์เพื่อพกพา


1
แน่นอนฉันอ่านคู่มือเปลือก bourn มันระบุว่ารุ่นที่ใหม่กว่า/bin/shได้ดำเนินการ&>/dev/nullไวยากรณ์ aparently ไม่เป็นเช่นนั้นหรือฉันมีรุ่นเก่า (ซึ่งผมไม่สามารถสะท้อนในทางใดทางวิ่ง OpenBSD 5.3 สรรพสินค้าใหญ่ดังนั้นควรจะเพียงพอ)
Torxed

8
@Torxed OpenBSD shใช้ pdksh ทุกวันนี้บอร์นเชลล์ไม่มีแล้ว cshแนะนำยังมีอยู่ใน>& เลือก(ตอนนี้สนับสนุนโดยและอนุพันธ์บางส่วน) แม้ว่ามันจะแบ่งการปฏิบัติตาม POSIX อย่างชัดเจนเนื่องจากเป็นไวยากรณ์ POSIX ที่ถูกต้องสมบูรณ์ซึ่งหมายถึงบางสิ่งที่แตกต่างอย่างสิ้นเชิง zshbash&>zshpdkshfoo &> file
Stéphane Chazelas

3
@ StéphaneChazelas (... ) ซึ่งหมายถึงบางสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิงคุณทิ้งฉันสงสัยว่ามันหมายถึงอะไรในกรณีนี้ ... :)
Piotr Dobrogost

4
@PiotrDobrogost foo &> fileเป็นเหมือนfoo & > fileหรือfoo & : > fileที่เรียกใช้ foo ในพื้นหลังและเปิดไฟล์สำหรับการเขียนโดยไม่มีคำสั่งเลย (ไม่น่าจะใช้แบบนั้น)
Stéphane Chazelas

5
@PiotrDobrogost, >&ไม่เหมาะไม่ว่าจะเป็นมันขัดแย้งกับ>&2, >&-ผู้ประกอบการ zshเพิ่มไว้เพื่อความสะดวกสำหรับผู้ใช้ csh (ไม่มี csh >&2) พวกมันเป็นแค่น้ำตาลซินแทคติคเพียงแค่ใช้> file 2>&1ซึ่งเป็นมาตรฐานและพกพาได้
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.