สิ่งใดที่ทำให้ `> 'ล้มเหลวในระบบ Linux ได้


20

ฉันรันคำสั่งนี้:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json

เพื่อดัมพ์ข้อมูลลงในpartyapp_dump.jsonไฟล์ แต่ข้อมูลทั้งหมดเพิ่งพิมพ์บนหน้าจอและสร้างpartyapp_dump.jsonไฟล์เปล่า

ทำไมสิ่งนี้ถึงเกิดขึ้นได้? ฉันทดสอบls > partyapp_dump.jsonและทำงานได้อย่างสมบูรณ์

คำตอบ:


40

ด้วย>คุณจะเปลี่ยนเส้นทางเอาต์พุตมาตรฐานเท่านั้น ลอง2>แทนเพื่อเปลี่ยนเส้นทางข้อผิดพลาด ใช้&>เพื่อเปลี่ยนเส้นทางทั้งสอง


1
FYI &>จะทำงานใน zash Bash 4.0 และ iirc เวอร์ชันล่าสุดเท่านั้น สำหรับโซลูชันแบบพกพาที่มากขึ้น, foo > bar 2&>1. การอ้างอิง: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs

6
@Rein Henrichs: นั่นเป็น 2> & 1 ไม่ 2> 1
camh

ฉันจำได้ด้วย pneumonic (?) จากการเขียนโปรแกรม: '2' ถึง ('>') ตำแหน่ง ('&') ของ '1'
hometoast

1
@hometoast: คุณหมายถึงช่วยในการจำ? :) Pneumonic แปลว่าปอด ...
carlpett

22

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

คุณสามารถลองวางกับ STDERR (ช่องที่ 2) เช่นนี้:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1

การ2>&1สร้างเชื่อมต่อกระแสเอาต์พุตสำหรับข้อผิดพลาดกับช่องสัญญาณปกติ เป็นเรื่องผิดปกติสำหรับโปรแกรมที่จะสร้างเอาต์พุตที่คุณต้องการจับภาพบนช่องข้อผิดพลาด โดยปกติแล้วจะถูกสงวนไว้สำหรับข้อมูลการดีบักไม่ใช่ข้อมูลแอปพลิเคชัน โปรดใช้สคริปต์นี้ด้วยความระมัดระวังเนื่องจากมีการทำงานที่ไม่ได้มาตรฐาน

คุณสามารถดัมพ์ช่องสัญญาณขาออกและข้อผิดพลาดไปยังไฟล์ต่าง ๆ ดังนี้:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt

5

นอกเหนือจากคำอธิบายเอาต์พุต stderr vs stdout ที่แนะนำแล้วแอ็พพลิเคชันของคุณอาจละเว้นสตรีมเหล่านี้ทั้งสองและเปิด "/ dev / tty" อย่างชัดเจนสำหรับเอาต์พุต


1

หากnoclobberตั้งค่าตัวเลือก bash ไว้> การเปลี่ยนเส้นทาง> จะล้มเหลว (แม้ว่าจะไม่เงียบ) หากไฟล์ปลายทางมีอยู่แล้ว

เพื่อความสะดวกในการพกพาใช้cmd >| fileบังคับให้เขียนทับไฟล์ที่มีอยู่


0

หากคุณหลงทางคุณสามารถลองรันด้วย strace เพื่อดูว่ากระบวนการทำงานอยู่หรือไม่:

strace -f command

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