कुछ गोले में '' नोहप कमांड> & / देव / नल '' काम '' क्यों लगता है?


12

मैंने Ask Ubuntu पर एक उत्तर संपादित किया जो निम्नलिखित सुझाव दे रहा था

nohup gedit >& /dev/null & 

जब वे वास्तव में मतलब था

nohup gedit &> /dev/null & 

उत्तरार्द्ध सही ढंग से stderr और stdout दोनों को पुनर्निर्देशित करता है /dev/null। मैं पूर्व में यह अपेक्षा कर रहा था कि या तो एक फाइल बनाई जाए &, जिसे या तो अधिक संभावना है, एक त्रुटि देने के लिए जैसा कि अन्य मामलों के लिए है:

$ echo "foo" >& 
bash: syntax error near unexpected token `newline'

इसके बजाय, यह ठीक उसी तरह से काम करता है जैसे पूर्व में, एक geditविंडो दिखाई देती है और कोई त्रुटि संदेश मुद्रित नहीं होता है।

मुझे यह भी ध्यान रखना चाहिए कि यह शेल विशिष्ट है:

  • bash(4.2.45 (1) -release), zsh(5.0.2), csh(डिबेट पैकेज संस्करण: 20110502-2) और tcsh(6.18.01): ऊपर वर्णित के अनुसार काम करता है, कोई त्रुटि संदेश नहीं, कोई फ़ाइल नहीं बनाई गई।

  • dash (0.5.7-3):

    $ nohup gedit >& /dev/null & 
    $ dash: 2: Syntax error: Bad fd number
  • ksh(93u + 2012-08-01): विफल रहता है, लेकिन एक प्रक्रिया स्पष्ट रूप से शुरू होती है ( 1223) हालांकि कोई geditखिड़की नहीं दिखाई देती है:

    $ nohup gedit >& /dev/null & 
    [1] 1223
    $ ksh: /dev/null: bad file unit number
  • fish (2.0.0):

    > nohup gedit >& /dev/null & 
    fish: Requested redirection to something that is not a file descriptor /dev/null
    nohup gedit >& /dev/null & 
                   ^

तो, क्यों यह कमांड केवल कुछ गोले में कोई त्रुटि (और कोई आउटपुट फ़ाइल नहीं बनाई गई) के साथ चलती है और दूसरों में विफल रहती है? >&जाहिरा तौर पर विशेष मामले में क्या कर रहा है nohup? मैं अनुमान लगा रहा हूं कि >& /dev/nullइसकी व्याख्या की जा रही है, >&/dev/nullलेकिन अंतरिक्ष इन गोले में त्रुटि क्यों नहीं कर रहा है?


मेरी मशीन, Ubuntu 12.04 में, यह कमांड सामान्य रूप से चलती है dash
cuonglm

nohup command, अपने आवेदन को स्वतंत्र रूप से चलाएं। मेरी मेमोरी के अनुसार, इसका dashविस्तार ash, द्वारा विकसित Debian ash, और यह सीमित शेल है, यहां तक ​​कि maemo OS (n900 मोबाइल पर डेबियन बेस) डैश का उपयोग करता है, पारिवारिक शेल में बैश या टीसीएच के सीमित उपयोग की उम्मीद है। ashOpenBSDash
फारसगुल्फ

@Gnouc हुह, शायद एक अलग संस्करण (मैं डेबियन पर हूँ)? मैं यह पता नहीं लगा सकता कि मुझे dashइसका संस्करण कैसे प्रिंट करना है 0.5.7-3, लेकिन पैकेज क्या है , आपका क्या है? क्या आप सुनिश्चित हैं कि आप चल रहे हैं dash? उबंटू का डिफ़ॉल्ट shयह नहीं है?
terdon

@MohsenPahlevanzadeh मुझे यकीन नहीं है कि आपकी बात क्या है, मुझे पता है कि क्या nohupकरता है, मेरा सवाल यह है कि >&कुछ गोले में अकेले nohup के साथ काम करने लगता है।
terdon

: आप गोले की abstarct देखने के लिए नीचे दिए गए लिंक का उपयोग कर सकते unix.stackexchange.com/questions/45684/...
PersianGulf

जवाबों:


18
nohup gedit &> /dev/null

POSIX सिंटैक्स है और निम्न के समान है:

nohup gedit &
> /dev/null

यह nohup geditपृष्ठभूमि में चलाया जाता है और फिर > /dev/nullकमांड को चलाए बिना पुनर्निर्देशन करता है ।

nohup gedit >& /dev/null

POSIX सिंटैक्स नहीं है और cshदोनों stdout और stderr को / dev / null में रीडायरेक्ट करने का तरीका है। बॉर्न में पाए जाने cshवाले 2>&1ऑपरेटर के पास नहीं है , इसलिए यह एकमात्र तरीका cshहै कि स्ट्रीडर को पुनर्निर्देशित किया जाए।

zsh(जैसा कि अक्सर) cshसिंटैक्स के साथ भी प्रदान करता है , लेकिन यह बॉर्न शेल के x>&y fd दोहराव ऑपरेटर का भी समर्थन करता है , जिसका अर्थ है कि वहां एक संघर्ष है।

ls >&file

रीडायरेक्ट lsके स्टडआउट और स्ट्राइडर के लिए file, लेकिन अगर फ़ाइल है 2, तो आपको एक समस्या है

ls >&2

इसका मतलब है कि संसाधन को पुनर्निर्देशित करना fd 2 द्वारा इंगित संसाधन ( dup(2, 1))। इसलिए आपको इसे लिखने की आवश्यकता है:

ls >& ./2

यदि आप मौजूदा निर्देशिका lsमें एक फ़ाइल में stdout और stderr दोनों को पुनर्निर्देशित करना चाहते थे 2; या मानक सिंटैक्स का उपयोग करें।

bashशुरू में समझ में नहीं आया >&, लेकिन इसने &>इसके बजाय ऑपरेटर को पेश किया , प्रक्रिया में POSIX अनुपालन को तोड़ दिया (हालांकि यह संभावना नहीं है कि स्क्रिप्ट का उपयोग नहीं होगा cmd &> xxx)।

ksh2009 में ksh93t + में उस ऑपरेटर की नकल की, 2008 में R35 में mksh ( posixमोड में अक्षम ) लेकिन नहीं >&

bash>&2.05 में समर्थन जोड़ा गया ।

बिजीबॉक्स shने दोनों के लिए &>और >&1.13 (2008) में समर्थन जोड़ा ।

न तो >&और न ही &>अर्थ के रूप में पुनर्निर्देशन stdout और Stderr POSIX / Bourne हैं।

यदि आप दोनों stdout और Stderr को पुर्ननिर्देशित करना चाहते हैं, तो वाक्य रचना है

cmd > file 2>&1

क्या आपका मतलब POSIX/Bourneहै "बॉर्न" से बैश ?
पंड्या
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.