मुझे इस बैश स्क्रिप्ट में कमांड के निकास मान क्यों नहीं मिल सकते हैं?


9

इसलिए मैं इस छोटे से नॉटिलस स्क्रिप्ट को एमपी 3 में वीडियो ट्रांसकोडिंग के लिए लिख रहा था:

#! /bin/bash -x

if [ -z "$1" ]
    then
    zenity --warning --text="Error - No file selected !"
    exit 1
fi

BASEFILENAME=${1%.*}

exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&

if [ "$?" -eq 0 ]
    then
    zenity --info --text="Converting successful"
    exit
fi

समस्या यह है, हालांकि ffmpeg कमांड को सफलतापूर्वक निष्पादित किया जाता है if [ "$?" -eq 0 ]

लगता है ट्रिगर नहीं हो रहा है। ऐसा क्यों है? है &&गलत है या यह कुछ और है?

जवाबों:


13

जिस तरह से बयान तक पहुँचा जा सकता है वह एकमात्र तरीका है यदि execस्वयं विफल हो जाता है; यदि यह सफल होता है, तो ffmpegकमांड शेल को पूरी तरह से बदल देता है। (स्वाभाविक रूप से, &&उस मामले में भी विफल हो जाएगा ताकि यह सब तक नहीं पहुंच सके।) आप इसे नहीं चाहते execहैं, बस इसे चलाएं।


मैं देख रहा हूँ, और बिना &&ffmpeg कमांड के बाद यह वास्तव में काम करता है। मेरे पास अभी भी एक और सवाल है, अगर यह इस जगह पर ठीक है - क्या टर्मिनल विंडो का उपयोग किए बिना ffmpeg के stdout और stderr को प्रदर्शित करने का कोई तरीका है? जैसे zenity fe
tesseract

आप इसे $()एक चर में निर्माण के साथ कैप्चर करना चाहते हैं , फिर उस चर को पास करें zenity। के हवाले से सावधान रहें, और zenityमेरे अनुभव में Pango का उपयोग करता है तो आप को बदलने की जरूरत है <, &, >साथ &lt;, &amp;, &gt;क्रमशः।
गीकॉइसर

5

exec commandबयान के साथ वर्तमान खोल बदल देता है command। यही है, आपकी स्क्रिप्ट एक्टॉली लाइन पर समाप्त होती है exec ffmpeg ...; शेष पंक्तियों को क्रियान्वित किया जाएगा यदि और केवल तभी जब ffmpegआपके PATH पर कमांड नहीं मिला है (या इसे अन्य कारणों से लॉन्च नहीं किया जा सकता है)।

आप bash कमांड प्रॉम्प्ट पर execटाइप करके bash पर अधिक जानकारी प्राप्त कर सकते हैं help exec:

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.
    [...]

1

इसके अनुसार exec शेल आपके द्वारा निर्दिष्ट कमांड के साथ बदल देता है। इसलिए आपकी स्क्रिप्ट कभी भी अतीत के आदेशों तक नहीं पहुंच पाती है exec

आप की जरूरत नहीं है exec। बस आज्ञा निर्दिष्ट करें।


0

execयदि आप इसे किसी सबहेल्ड में रखते हैं तो आप कमांड रख सकते हैं :

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&

मैं देख रहा हूँ, लेकिन &&अभी भी वहाँ गलत नहीं है?
tesseract

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