বাহ্যিকভাবে ডাকলে স্ক্রিপ্ট কাজ করছে না


8

আমি .mp4 ফাইল থেকে .mp3s তৈরি করতে একটি সাধারণ স্ক্রিপ্ট ব্যবহার করি:

#!/bin/bash
for i in *.mp4
do
ffmpeg -i "$i" -ab 128k "${i%mp4}mp3"
done

ডেস্কটপ থেকে চালানো বা টার্মিনালের মাধ্যমে ডাকলে স্ক্রিপ্টটি ঠিকঠাক হয়। যখন স্ক্রিপ্টটি বাহ্যিক স্ক্রিপ্ট থেকে কল করা হয়, এটি চালাতে ব্যর্থ হয়, ফিরে আসে

"* .mp4: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"।

আমি সন্দেহ করি যে সমস্যাটি শেল প্রসার নিয়ে রয়েছে, তবে কীভাবে এই পরিস্থিতিতে এটি ঠিক করা যায় তা সম্পর্কে আমার মাথা গুটিয়ে রাখতে পারে না।

উত্তর:


13

আপনি একটি আপেক্ষিক পথ ব্যবহার করছেন, যেখানে আপনার স্ক্রিপ্টটি .mp4বর্তমান ডিরেক্টরিতে ফাইলগুলি সন্ধান করছে অর্থাৎ যে স্ক্রিপ্টটি স্ক্রিপ্টটি চালাচ্ছে এবং যেখানে খুঁজে পাওয়া যায় যে এ জাতীয় কোনও .mp4ফাইল নেই, তখন এটি একটি আক্ষরিক *.mp4ফাইলের সন্ধান করে (ধরে নিচ্ছে nullglob/ নেই failglob) সেট করুন, যা পূর্বনির্ধারিত) এবং সেই ফাইলটি খুব বেশি বিদ্যমান না, সুতরাং ত্রুটি বার্তা *.mp4: No Such File or Directory

পরিবর্তে আপনার নিখুঁত পাথ ব্যবহার করা উচিত:

for i in /directory/*.mp4; do ...; done

/directory/প্রকৃত ডিরেক্টরি পাথ দিয়ে প্রতিস্থাপন করুন ; আপনি যদি চান তবে আপনি ডিরেক্টরি নামটি প্রথম যুক্তি হিসাবেও নিতে পারেন:

for i in "$1"/*.mp4; do ...; done

আপনি এখানে পরম বা আপেক্ষিক পাথ ব্যবহার করতে পারেন, তবে আবার পরম পথটি সর্বদা নিরাপদ বিকল্প।

এখন সাধারণ পদ্ধতিতে এক্সিকিউটেবল স্ক্রিপ্ট কল করুন:

/path/to/script.sh /directory

স্ক্রিপ্ট ডিরেক্টরি থেকে:

./script.sh /directory

সাহায্যের জন্য ধন্যবাদ. আপনাকে বলতে যাচ্ছিলাম আমি ইতিমধ্যে এটি ব্যর্থ চেষ্টা করেছি, কিন্তু তখন আমি লক্ষ্য করেছি যে আমি "এইচ" কে "/ হোম" এর মধ্যে প্রথমবারের মধ্য দিয়েছি ized যুক্তি হিসাবে পথটি বিশেষভাবে কার্যকর ছিল। চিয়ার্স।
এম স্ট্রিট

যেখানে "ত্রুটি বার্তা" আসলে এর অর্থ: শেল *.mp4যে কোনও ফাইলের সাথে মিলতে অক্ষম তাই এটি একে আক্ষরিক ফাইলের নাম হিসাবে বিবেচনা করে এবং ফাইলটি *.mp4(যা একটি বৈধ ফাইলের নাম) খোলার চেষ্টা করে এবং ব্যর্থ হয় কারণ আপনার কোনও ফাইল নেই *.mp4বর্তমান ডিরেক্টরি বলা হয়। কেউ ভাবতে পারেন যে *.mp4সবসময় ফাইলের নামের সাথে তাল মিলিয়ে প্রসারিত হবে যা খালি থাকতে পারে (এবং সেই ক্ষেত্রে forলুপটি কিছুই করবে না, তবে কোনও ত্রুটি উত্থাপিত হবে না), এটি এমন নয়: *.mp4সর্বদা কোনও কিছুর দিকে প্রসারিত হয়।
বাকুরিউ

@ বাকুরিউ যদিও এই ক্ষেত্রে এটি সত্য (বা পূর্বনির্ধারিত bash) তবে সর্বদা নয়; তাকান nullglob/ failglob
হিমেইল

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