क्या लिनक्स में `>` चुपचाप विफल हो सकता है?


20

मैंने यह आदेश चलाया:

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

partyapp_dump.jsonफ़ाइल में डेटा डंप करने के लिए । लेकिन सारा डेटा सिर्फ स्क्रीन पर प्रिंट हो जाता है और एक खाली partyapp_dump.jsonफाइल बन जाती है।

ऐसा क्यों हो सकता है? मैंने परीक्षण किया ls > partyapp_dump.jsonऔर यह पूरी तरह से काम किया।

जवाबों:


40

> के साथ आप केवल मानक आउटपुट पुनर्निर्देशित करते हैं। त्रुटि आउटपुट को पुनर्निर्देशित करने के बजाय 2> आज़माएं । का प्रयोग करें और> दोनों को अंतरित करें।


1
FYI करें, &>केवल Bash 4.0 में काम करेगा और zsh के हाल के संस्करणों को iirc लेगा। एक अधिक पोर्टेबल समाधान के लिए, foo > bar 2&>1। संदर्भ: mywiki.wooledge.org/BashFAQ/014
री हेनरिक्स

6
@ हेन हेनरिच: वह 2> और 1 है, 2 नहीं और> 1
कैम

मैं इसे एक न्यूमोनिक (?) प्रोग्रामिंग से याद करता हूं: '2', से ('>') '1' का स्थान ('और')
hometoast

1
@ गोमेटोस्ट: आपका मतलब है मेमनोनिक? :) न्यूमोनिक का अर्थ है फेफड़ा ...
carlpett

22

आपका अजगर ऐप सामान्य STDOUT के बजाय STDERR आउटपुट चैनल पर आउटपुट होना चाहिए। शेल निर्माण का उपयोग >केवल आउटपुट चैनल पर लिखे गए डेटा को कैच और रीडायरेक्ट करता है, लेकिन वास्तव में कई अन्य चैनल हैं जिन्हें मुद्रित किया जा सकता है, सबसे आम दूसरा है, जो आमतौर पर त्रुटियों के लिए उपयोग किया जाता है।

आप STDERR (दूसरा चैनल) को इस तरह फँसाने की कोशिश कर सकते हैं:

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 बनाम stdout आउटपुट स्पष्टीकरण के अलावा, आपका एप्लिकेशन इन दोनों धाराओं को अनदेखा कर सकता है और इसके आउटपुट के लिए स्पष्ट रूप से "/ dev / tty" खोल सकता है।


1

यदि noclobberबैश विकल्प सेट किया गया है, तो> गंतव्य फ़ाइल पहले से मौजूद है, तो पुनर्निर्देशन विफल (चुपचाप नहीं) होगा।

बेहतर पोर्टेबिलिटी के लिए, cmd >| fileकिसी भी मौजूदा फ़ाइल को ओवरराइट करने के लिए उपयोग करें।


0

यदि आप खो गए हैं, तो आप हमेशा यह देखने के लिए इसे चलाने की कोशिश कर सकते हैं कि प्रक्रियाएँ क्या कर रही हैं:

strace -f command

1
सही उत्तर, लेकिन विशेष रूप से प्रासंगिक नहीं। अगर आदमी अब त्रुटि धारा के प्रबंधन के बारे में नहीं सोचता है, तो मुझे नहीं लगता कि वह यह जानने वाला है कि आउटपुट का क्या करना है strace
कालेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.