linux - Bash স্ক্রিপ্ট থেকে প্রস্থান করার যেকোনো উপায়, কিন্তু টার্মিনালটি ছেড়ে দেওয়া হয় না
(8)
"সমস্যা" সত্যিই আপনি sourcing করছি এবং স্ক্রিপ্ট নির্বাহ করা হয় না। যখন আপনি একটি ফাইল উৎস করেন, তখন তার সামগ্রীগুলি একটি শেলহেলের পরিবর্তে বর্তমান শেলে কার্যকর হবে। সুতরাং প্রস্থান সহ সবকিছু, বর্তমান শেল প্রভাবিত করবে।
exit
ব্যবহার করার পরিবর্তে, আপনি return
ব্যবহার করতে চান।
যখন আমি শেল স্ক্রিপ্টে exit
কমান্ড ব্যবহার করি, স্ক্রিপ্টটি টার্মিনালটি বন্ধ করে দেবে (প্রম্পট)। একটি স্ক্রিপ্ট বিনষ্ট এবং তারপর টার্মিনালে থাকার কোন উপায় আছে?
আমার স্ক্রিপ্ট run.sh
সরাসরি sourced, অথবা অন্য স্ক্রিপ্ট থেকে sourced দ্বারা চালানো আশা করা হয়।
সম্পাদনা করুন: আরো নির্দিষ্ট হতে, run2.sh
হিসাবে দুটি স্ক্রিপ্ট আছে
...
. run.sh
echo "place A"
...
এবং run.sh
হিসাবে
...
exit
...
যখন আমি এটা চালানো . run2.sh
. run2.sh
, এবং run.sh এ exit
কোডলাইনটি আঘাত করলে আমি টার্মিনালে থামাতে চাই এবং সেখানে থাকি। কিন্তু exit
ব্যবহার করে, পুরো টার্মিনাল বন্ধ পায়।
PS: আমি return
ব্যবহার করার চেষ্টা করেছি, কিন্তু কোডলাইন echo
এখনও কার্যকর হবে ....
1) প্রস্থান 0 সফল হলে এটি স্ক্রিপ্ট থেকে বের হবে।
2) এটি ব্যর্থ হলে স্ক্রিপ্ট থেকে প্রস্থান 1 বের হবে।
আপনি এই req উপর ভিত্তি করে দুই উপরে চেষ্টা করতে পারেন।
এছাড়াও প্রত্যাশিত ফেরত মান সঙ্গে ফিরে নিশ্চিত করুন। অন্যথায় যদি আপনি প্রস্থান ব্যবহার করে প্রস্থান ব্যবহার করেন তবে এটি আপনার বেস শেল থেকে প্রস্থান করবে কারণ উৎস অন্য প্রক্রিয়া তৈরি করে না।
এটা সঠিক যে sourced বনাম এক্সিকিউটেড স্ক্রিপ্ট একই অধিবেশন খোলা রাখা return
বনাম exit
ব্যবহার, অন্যদের হিসাবে উল্লেখ আছে।
এখানে একটি সম্পর্কিত টিপ রয়েছে, যদি আপনি কোনও স্ক্রিপ্টটি চান যা সেশনটি খোলা রাখা উচিত, এটি সোর্স করা হয়েছে কিনা তা নির্বিশেষে।
নিম্নলিখিত উদাহরণ সরাসরি foo.sh
মত চালানো যেতে পারে বা sourced মত . foo.sh
. foo.sh
/ source foo.sh
"Exit" এর পর সেটি সেশনটি খোলা রাখবে। [email protected]
স্ট্রিং পাস করা হয়েছে যাতে ফাংশনটি বাইরের স্ক্রিপ্টের আর্গুমেন্টগুলিতে অ্যাক্সেস করতে পারে।
#!/bin/sh
foo(){
read -p "Would you like to XYZ? (Y/N): " response;
[ $response != 'y' ] && return 1;
echo "XYZ complete (args [email protected]).";
return 0;
echo "This line will never execute.";
}
foo "[email protected]";
টার্মিনাল ফলাফল:
$ foo.sh
আপনি কি XYZ করতে চান? (Y / N): এন
$। foo.sh
আপনি কি XYZ করতে চান? (Y / N): এন
$ |
(টার্মিনাল উইন্ডো খোলা থাকে এবং অতিরিক্ত ইনপুট গ্রহণ করে)
যখন আপনি কাজ করেন তখন মূল exit
/ return
নীচে স্ক্র্যাপ কোডের একটি গুচ্ছ রাখলে এটি একটি একক টার্মিনালে দ্রুত স্ক্রিপ্ট পরিবর্তনগুলির জন্য উপযোগী হতে পারে। এটি একটি অর্থে আরও পোর্টেবল কোড তৈরি করতে পারে (যদি আপনার কাছে কয়েকটি স্ক্রিপ্ট থাকে যা বিভিন্ন উপায়ে বলা যেতে পারে বা নাও হতে পারে), তবে এটি ঠিক যেখানে return
এবং যথাযথ যেখানে exit
যায় সেগুলি ব্যবহার করা অনেক কম।
পরিবর্তে ব্যবহার করে কোড চলমান . run2.sh
. run2.sh
আপনি sh run2.sh
বা bash run2.sh
ব্যবহার করে স্ক্রিপ্টটি চালাতে পারেন
স্ক্রিপ্টটি চালানোর জন্য একটি নতুন উদাহরণ খোলা হবে তারপর স্ক্রোলের শেষে এটি বন্ধ করা হবে অন্য শেলটি খোলা রেখে। `
প্রকৃতপক্ষে আমি মনে করি আপনি "স্ক্রিপ্ট চালানোর" উপায় দ্বারা বিভ্রান্ত হতে পারেন।
যদি আপনি স্ক্রিপ্ট চালানোর জন্য sh
ব্যবহার করেন তবে বলুন, sh ./run2.sh
, এমনকি যদি এমবেডেড স্ক্রিপ্টটি exit
শেষ হয় তবে আপনার টার্মিনাল উইন্ডোটি এখনও থাকবে।
তবে আপনি ব্যবহার করেন তবে .
অথবা source
, যখন আপনার সাবস্ক্রিপ্ট শেষ হয় তখন আপনার টার্মিনাল উইন্ডোটি প্রস্থান / বন্ধ হবে।
আরো বিস্তারিত জানার জন্য, sh
এবং source
ব্যবহার করার মধ্যে পার্থক্য কী?
যদি আপনার টার্মিনাল এমুলেটরটি থাকে না-আপনি একটি sourced স্ক্রিপ্ট sanitize করতে পারেন এবং টার্মিনাল ধরে রাখতে পারেন:
#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read
অন্যথায় আপনি $TERM -hold -e script
ব্যবহার করতে পারেন
রিটার্ন কমান্ডের পরে আপনি একটি অতিরিক্ত প্রস্থান কমান্ড যোগ করতে পারেন যাতে এটি কমান্ড লাইন থেকে স্ক্রিপ্ট নির্বাহ এবং টার্মিনাল থেকে সোর্সিংয়ের জন্য কাজ করে।
স্ক্রিপ্ট উদাহরণ উদাহরণ প্রস্থান কোড:
if [ $# -lt 2 ]; then
echo "Needs at least two arguments"
return 1 2>/dev/null
exit 1
fi
return
কমান্ডের পরে স্ক্রিপ্ট উৎস করার সময় exit
কমান্ডের সাথে লাইন বলা হবে না।
যখন আপনি স্ক্রিপ্টটি চালান, return
কমান্ড একটি ত্রুটি দেয়। সুতরাং, আমরা এটি /dev/null
ফরোয়ার্ড করে ত্রুটির বার্তা দমন করি।