क्यों यह ffmpeg कमांड bash में काम करता है और zsh नहीं?


17

आज मुझे काम से घर मिला (एक Ubuntu बॉक्स पर चलाओ) और अपने प्यारे zsh के साथ अपने स्थानीय आर्च बॉक्स पर कुछ कोड चलाने की कोशिश की और आदेश विफल हो रहे थे?

आदेश व्यक्तिगत जानकारी के साथ नीचे है और आईपी स्पष्ट रूप से बदल गया है

ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264  -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4

यह बैश में सही चलता है, लेकिन जब मैं इसे zsh में चलाता हूं तो मुझे त्रुटि मिलती है

zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264

मेरे प्यारे ज़श ने मुझे धोखा क्यों दिया है?


7
सिंगल कोट्स में rtsp लिंक डालने की कोशिश करें।
जीमिज

1
तुम मेरे हीरो हो :) मुझे पता था कि zsh मुझे निराश नहीं करेगा।
जॉन एलार्ड

1
बाद में कोशिश करें mkdir -p 'rtsp://user:pass@my.webserver.org:5554/my-media/media.amp-videocodec=h264'और फिर बैश और zsh दोनों आपको विफल कर देंगे। कम से कम zsh आपको यहाँ अपनी गलती दिखाता है।
स्टीफन चेज़लस

@cuonglm, मेरा मतलब था कि जब पैटर्न से मेल खाती हुई कोई फ़ाइल होगी, तो zsh और bash दोनों इसमें "विफल" होंगे, जिससे ग्लोब का विस्तार होगा। zsh का व्यवहार इस बात से स्पष्ट है कि जब कोई मेल न हो, तो यह आपको अपनी गलती का एहसास कराता है।
स्टीफन चेजालस

जवाबों:


43

स्ट्रिंग में:

rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264

आपके पास ?उस स्ट्रिंग में है, इसलिए पैटर्न पैटर्न मिलान नियमों का उपयोग करके शेल उस स्ट्रिंग पर pathname का विस्तार करेगा ।

में bash, यदि failglobविकल्प सेट नहीं किया गया था, जो कि डिफ़ॉल्ट है, तो असफल पैटर्न के रूप में छोड़ दिया जाएगा:

$ echo does-not-exist?
does-not-exist?

जबकि विकल्प सेट के zshसाथ कोई पैटर्न मिलान त्रुटि की रिपोर्ट करेगा nomatch, जो डिफ़ॉल्ट है:

$ echo does-not-exist?
zsh: no matches found: does-not-exist?

आप zshत्रुटि को दबा सकते हैं और पैटर्न प्रिंट कर सकते हैं :

$ setopt nonomatch
$ echo does-not-exist?
does-not-exist?

आप कर सकते हैं bashकी तरह व्यवहार zshके साथ nomatchविकल्प सेट, चालू करके failglob:

$ shopt -s failglob
$ echo does-not-exist?
bash: no match: does-not-exist?

अधिक सामान्य, आप शेल फ़ाइल नाम पीढ़ी को अक्षम कर सकते हैं:

$ set -f
$ : "The command"
$ set +f

(या set -o noglob, set +o noglob)

या शेल ट्रीट करने के लिए शेल क्विटिंग मेथड्स ?और अन्य पैटर्न का उपयोग करके विशेष वर्णों का मिलान करना।


zshnoglobबिलिन भी प्रदान करें , जो निम्नलिखित सरल कमांड के लिए किसी भी शब्द में फ़ाइल नाम पीढ़ी को अक्षम करता है:

$ noglob echo *
*

अरे वाह, यह याद करने के लिए शर्मनाक है, अच्छा उत्तर के लिए धन्यवाद।
जॉन एलार्ड

लेकिन अब यह मुझसे सवाल करता है: कोई इसे कैसे ठीक करेगा? उद्धरण का उपयोग करके? कुछ और? अत्यधिक जटिल बिल्ली + उपधाराएं? यह अच्छा होगा यदि आप इसे अपने उत्तर में जोड़ते हैं, इसे थोड़ा और सामान्य बनाने के लिए और अभी भी बहुत पूर्ण और सही है।
इस्माइल मिगुएल

अब यह एक बहुत बढ़िया जवाब है! मैंने उसके अनुसार उत्थान किया है। जवाब में वास्तव में आखिरी कमी थी। इसमें बताया गया कि क्या गलत है लेकिन फिक्स नहीं। धन्यवाद।
इस्माईल मिगुएल

एक अन्य विकल्प: zsh में, आप केवल कमांड के बहाने ग्लोबिंग को मौजूदा कमांड के लिए अक्षम कर सकते हैं noglob। जैसे noglob echo *बस उत्पादन होगा *
wjv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.