การเปลี่ยนเส้นทาง stderr ไม่ทำงานใน csh


11

ฉันเรียกใช้คำสั่งต่อไปนี้:

pkg_add emacs-23.4,2.tbz 2> output.log

เอาต์พุตยังคงแสดงในเทอร์มินัล เมื่อฉันกดฉันได้รับ

pkg_add emacs-23.4,2.tbz 2 > output.log

2ก่อนที่จะมีพื้นที่ที่

ฉันไม่ได้ใส่เดิม ฉันลอง

pkg_add emacs-23.4,2.tbz > output.log 2>&1

อีกครั้งเมื่อกด, พื้นที่ได้รับการเพิ่ม

ทำไมสิ่งนี้ถึงเกิดขึ้นกับฉัน

ฉันใช้ csh กับ FreeBSD

คำตอบ:


12

การเปลี่ยนเส้นทาง 2> ไม่ทำงานกับ csh หรือ tcsh

ใช้chshคำสั่งเพื่อเปลี่ยนเชลล์ของคุณเป็น / bin / sh หรือ / usr / local / bin / bash เพื่อใช้การ2>เปลี่ยนทิศทางสไตล์ หมายเหตุ:อย่าเปลี่ยนเชลล์ของรูทเป็น / usr / local / bin / bash

csh และ tcsh ไม่สามารถเปลี่ยนเส้นทางออกมาตรฐานและข้อผิดพลาดแยกต่างหาก แต่>&จะเปลี่ยนเส้นทางผลลัพธ์รวมไปยังไฟล์


+1 และ✔ shผมเปลี่ยนเปลือกหอยใช้
gadgetmo

1
@Craig เขาทำงานpkg_addบน FreeBSD ดังนั้นฉันคิดว่านี่เป็นของผู้ใช้รูท (/ bin / csh เป็นค่าเริ่มต้นสำหรับรูทบน FreeBSD) ในกรณีนี้คุณไม่ควรเปลี่ยนเชลล์เป็น / usr / local / bin / bash / bin / sh เป็นที่ยอมรับ คุณสามารถสลับไปยังเชลล์อื่นหลังจากล็อกอินเป็นรูท
James O'Gorman

@ JamesO'Gorman เยี่ยมมากฉันอัพเดตคำตอบแล้ว
Craig

20

ฉันไม่แน่ใจว่าคุณกำลังพยายามซ่อน STDERR หรือเปลี่ยนเส้นทางไปที่ STDOUT

ในการเปลี่ยนเส้นทาง STDOUT ไปที่ไฟล์:

pkg_add emacs-23.4,2.tbz > stdout.log

ในการเปลี่ยนเส้นทาง STDOUT และ STDERR ไปยังไฟล์:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

ในการเปลี่ยนเส้นทาง STDOUT ไปที่ไฟล์และซ่อน STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

ในการเปลี่ยนเส้นทาง STDOUT ไปที่คอนโซลและซ่อน STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

ในการเปลี่ยนเส้นทาง STDOUT ไปที่คอนโซลและ STDERR ไปยังไฟล์:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

ในการเปลี่ยนเส้นทาง STDOUT ไปที่ไฟล์และ STDERR เป็นไฟล์:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

แก้ไข: เหตุผลว่าทำไมงานนี้คือการกระทำใน () ของเกิดขึ้นก่อน; เอาล่ะถ้าเราเปลี่ยนเส้นทาง STDOUT แล้วมันจะไม่สามารถใช้งานได้นอก () ของ สิ่งนี้ทำให้เรามีเพียง STDERR และจากนั้นเราสามารถเปลี่ยนเส้นทางที่ต้องการ


สวัสดี @nikc ยินดีต้อนรับสู่ unix.SE. ความคิดเห็นของคุณมีประโยชน์และให้ข้อมูล ฉันขอแนะนำให้แก้ไขคำตอบของคุณและรวมไว้ในนั้นดังนั้นจึงไม่ควรพลาด
drs

1

ฉันรู้วิธีการทำใน Csh แต่ใช้ 2 shells:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

วิธีดังกล่าวอนุญาตให้เปลี่ยนเส้นทางเฉพาะ stderr ไปยัง file.txt โดยไม่ต้อง stdout - คือสิ่งที่คุณต้องการ

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