প্রস্থান আদেশের প্রস্থান কোড ক্যাপচার করুন


10

আমার এটি একটি বাশ স্ক্রিপ্টে রয়েছে:

exit 3;

exit_code="$?"

if [[ "$exit_code" != "0" ]]; then
    echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
    exit "$exit_code";
fi

দেখে মনে হচ্ছে এটি প্রস্থান কমান্ডের ঠিক পরে প্রস্থান করবে, যা বোঝা যায়। আমি ভাবছিলাম যে এমন কোনও সাধারণ কমান্ড আছে যা এই মুহুর্তে বাইরে না এসে একটি প্রস্থান কোড সরবরাহ করতে পারে?

আমি অনুমান করতে যাচ্ছি:

exec exit 3

কিন্তু এটি একটি ত্রুটির বার্তা দেয়: exec: exit: not found। আমি কি করতে পারি? :)


1
হ্যাঁ exec exit 3কোনও "exec: exit: not found"

7
আমি প্রশ্নটি বুঝতে পারি না। কেন সম্পূর্ণভাবে লাইন সেট exit_code=3এবং মুছে ফেলা হচ্ছে exit 3না?
wjandrea

@wjandrea ব্যবহারিকের চেয়ে ধারণাগত প্রশ্ন

2
এটি এখনও আমার কাছে কোনও ধারণা রাখে না। আপনি যদি প্রকৃতপক্ষে প্রস্থান না করেন তবে কেন একটি প্রস্থান কোড থাকবে?
বারমার

1
@ বারমার প্রতিটি প্রক্রিয়ার একটি প্রস্থান কোড রয়েছে। বেশিরভাগ লোকেরা প্রশ্নের উত্তর দেওয়ার চেষ্টা করছে যা "স্ক্রিপ্টের সাথে 'প্রস্থান 3' প্রতিস্থাপন করতে পারি যাতে এটি $?ভেরিয়েবলটি নির্ধারণ করে তবে এই স্ক্রিপ্টটি প্রস্থান করে না "?
আইক্রাস

উত্তর:


32

আপনার যদি এমন কোনও স্ক্রিপ্ট থাকে যা কিছু প্রোগ্রাম চালায় এবং প্রোগ্রামটির প্রস্থান স্থিতি (সহ $?) দেখেন  এবং আপনি সেই স্ক্রিপ্টটি এমন কিছু করে পরীক্ষা করতে চান যা $?কিছু জ্ঞাত মান (উদাহরণস্বরূপ 3) এ সেট করার কারণ হয়ে থাকে  , কেবলমাত্র

(exit 3)

প্রথম বন্ধনী একটি উপ-শেল তৈরি করে। তারপরে exitকমান্ডটি সেই উপ-শেলটিকে নির্দিষ্ট প্রস্থান স্থিতির সাথে প্রস্থান করতে পারে।


এছাড়াও, ডিবাগিংয়ের উদ্দেশ্যে এটি exit_code="3"পরীক্ষার জন্য সেট করা ঠিক যেমন সহজ হবে
সেন্টিমানে

1
হ্যাঁ, ওজান্দ্রিয়া গতকাল এটি উল্লেখ করেছেন।
জি-ম্যান

12

exitএকটি অন্তর্নির্মিত বাশ, তাই আপনি execএটি করতে পারবেন না । প্রতি ব্যাশের ম্যানুয়াল :

স্ক্রিপ্টে এক্সিকিউট করা শেষ কমান্ডের প্রস্থান স্থিতি হ'ল বাশের প্রস্থান স্থিতি। কোনও কমান্ড কার্যকর করা না হলে প্রস্থান স্থিতি 0 হয়।

এই সমস্ত একসাথে রেখে আমি বলব আপনার একমাত্র বিকল্প হ'ল আপনার পছন্দসই প্রস্থান স্থিতিটি একটি ভেরিয়েবলের মধ্যে সংরক্ষণ করা এবং তারপরে exit $MY_EXIT_STATUSযখন উপযুক্ত হয়।


hmmm আপনি @ জি-ম্যান আইডিয়া সম্পর্কে কী ভাবেন?

2
আপনি যা অর্জন করতে চাইছেন তা আমি ভুল বুঝেছি। যদি আপনি কেবল সেট করার চেষ্টা করছেন $?(তবে কেন আপনি সত্যই নিশ্চিত নন) তবে এটি শক্ত উত্তর বলে মনে হচ্ছে না। আপনি যদি এটি কিছু ব্যর্থ মান হিসাবে সেট করতে চান falseতবে অন্য একটি বিকল্প।
সোলারশাদো

10

আপনি একটি ফাংশন লিখতে পারেন যা আর্গুমেন্ট হিসাবে দেওয়া স্ট্যাটাসটি দেয় বা 255যদি না দেওয়া হয় returns (আমি এটিকে retএটির মানটিকে "ফেরত" হিসাবে বলি ))

ret() { return "${1:-255}"; }

এবং retআপনার কল করার জায়গায় ব্যবহার করুন exit। এটি বর্তমানে গৃহীত উত্তরে সাব-শেল তৈরির অদক্ষতা এড়িয়ে চলেছে।

কিছু পরিমাপ।

time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'

আমার মেশিনে প্রায় 3.5 সেকেন্ড সময় লাগে।

 time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'

আমার মেশিনে প্রায় 0.051 সেকেন্ড সময় নেয়, 70 গুণ দ্রুত। ডিফল্ট হ্যান্ডলিং এ রাখা এখনও এটি 60 গুণ দ্রুত ছেড়ে যায়। স্পষ্টতই লুপটির কিছুটা ওভারহেড রয়েছে। আমি যদি লুপটির দেহটিকে কেবলমাত্রে :বা trueতারপরে পরিবর্তন করি তবে সময়টি 0.05 এ অর্ধেক হয়ে যায়, সম্পূর্ণ খালি লুপটি অবৈধ সিনট্যাক্স। ;:লুপে যুক্ত করা থেকে বোঝা যায় যে এই সর্বনিম্ন কমান্ডটি 0.007 সেকেন্ড সময় নেয়, সুতরাং লুপের ওভারহেড প্রায় 0.018 হয়। দুটি পরীক্ষা থেকে এই ওভারহেডটি বিয়োগ করলে বোঝা যায় যে retসমাধানটি 100 গুণ বেশি দ্রুত।

স্পষ্টতই এটি একটি সিনথেটিক পরিমাপ, তবে জিনিসগুলি যুক্ত হয়। আপনি যদি সবকিছুকে তার প্রয়োজনের তুলনায় 100 গুণ ধীর করে দেন তবে আপনি ধীর সিস্টেমে শেষ করবেন। 0.0


2
@ iBug অতিরিক্ত স্থানের প্রয়োজন নেই।
আইক্রাস

সাব-শেল তৈরির অদক্ষতা সম্পর্কে ভাল কথা। আমি পড়েছি যে কিছু শাঁস এই জাতীয় ক্ষেত্রে কাঁটাচামচ অপ্টিমাইজ করতে যথেষ্ট স্মার্ট হতে পারে, তবে সেই ব্যাশ সেগুলির মধ্যে একটি নয়।
জি-ম্যান

3

সম্পর্কে exec exit 3... এটি বলা বাহ্যিক কমান্ড চালানোর চেষ্টা করবে exit, কিন্তু একটি নেই, সুতরাং আপনি ত্রুটিটি পান। শেলটি তৈরির পরিবর্তে এটি একটি বাহ্যিক কমান্ড হতে হবে, যেহেতু শেলটি পুরোপুরি exec প্রতিস্থাপন করে। এছাড়াও যার মানে এমনকি যদি আপনি নামক একটি বহিস্থিত দখল করে নিয়েছিল exit, exec exit 3আপনার শেল স্ক্রিপ্ট চালিয়ে যেতে ফিরে আসতে পারবেন না, যেহেতু শেল আরও আছে হবে না


1
আমি অনুমান করি আপনি করতে পেরেছিলেন exec bash -c "exit 3", তবে এই মুহূর্তে আমি এটি করার পক্ষে কোনও কারণ ভাবতে পারি না ন্যায়বিচারের বিপরীতে exit 3
ডেভিড জেড

1
@ ডেভিডজেড, যে কোনও ক্ষেত্রে, exec' আইএন বা কেবল exit' আইং স্ক্রিপ্টটি বন্ধ করবে, যা প্রশ্নটি চেয়েছিল বলে মনে হয় না।
ilkkachu

3

আপনি Awk এর মাধ্যমে এটি করতে পারেন:

awk 'BEGIN{exit 9}'

বা শেড:

sed Q9 /proc/stat

... বা একটি শেল দিয়ে:sh -c 'exit 9'
ইলক্কাচু

1
@ilkkachu Youre ভাল হিসাবে আপনি কি হতে পারে যে কাজ করতে যাচ্ছে যদি (exit 9)গৃহীত উত্তরে
স্টিভেন পেনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.