আমি কেন এই ব্যাশ স্ক্রিপ্টে কোনও কমান্ডের প্রস্থান মূল্য পেতে পারি না?


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 ফে মধ্যে
টেসেরাক্ত

আপনি এটির সাথে $()একটি ভেরিয়েবলের সাথে ক্যাপচার করতে চান , তারপরে সেই পরিবর্তনশীলটি পাস করুন zenity। মূল্য উদ্ধৃতি থেকে সাবধান, এবং zenityআমার অভিজ্ঞতা Pango ব্যবহার যাতে আপনি প্রতিস্থাপন করা প্রয়োজন <, &, >সঙ্গে &lt;, &amp;, &gt;যথাক্রমে।
গিকোসৌর

5

exec commandবিবৃতি দিয়ে বর্তমান শেল প্রতিস্থাপন command। এটি হ'ল, আপনার স্ক্রিপ্টটি কার্যতভাবে লাইনে শেষ হবে exec ffmpeg ...; অবশিষ্ট লাইনগুলি কার্যকর করা হবে যদি এবং কেবলমাত্র ffmpegআপনার PATH- এ কমান্ডটি পাওয়া যায় না (বা এটি অন্যান্য কারণে চালু করা যায় না)।

বাশ কমান্ড প্রম্পটে execটাইপ করে বিল্ট ইন বাশ সম্পর্কে আরও বিশদ পেতে পারেন 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") &&

আমি দেখতে পাচ্ছি, কিন্তু &&সেখানে কি এখনও ভুল নেই?
টেসেরাক্ত

হ্যাঁ. এবং রাখার কি লাভ exec?
jmtd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.