বাশ স্ক্রিপ্ট থেকে প্রস্থান করার যে কোনও উপায়ে, তবে টার্মিনালটি প্রস্থান করে না


183

যখন আমি exitশেল স্ক্রিপ্টে কমান্ড ব্যবহার করি , স্ক্রিপ্টটি টার্মিনালটি (প্রম্পট) সমাপ্ত করে। কোনও স্ক্রিপ্ট শেষ করে টার্মিনালে থাকার কি কোনও উপায় আছে?

আমার স্ক্রিপ্টটি run.shসরাসরি উত্সাহিত হয়ে, বা অন্য স্ক্রিপ্ট থেকে উত্সাহিত হয়ে কার্যকর করা হবে বলে আশা করা হচ্ছে।

সম্পাদনা করুন: আরো নির্দিষ্ট হবে, দুটি স্ক্রিপ্ট হয় run2.shযেমন

...
. run.sh
echo "place A"
...

এবং run.shহিসাবে

...
exit
...

যখন আমি এটি চালাচ্ছি . run2.sh, এবং যদি এটি exitকোডলাইনটি হিট করে তবে run.shআমি এটি টার্মিনালে থামিয়ে সেখানে থাকতে চাই। তবে ব্যবহার exitকরে পুরো টার্মিনালটি বন্ধ হয়ে যায়।

পিএস: আমি চেষ্টা করার চেষ্টা করেছি return, তবে echoকোডলাইনটি এখনও কার্যকর হবে ....


5
আমাকে সত্যিই, সত্যিই, সত্যিই জিজ্ঞাসা করতে হবে: আপনি কেন স্রোতে লিপিটিতে প্রস্থান ব্যবহার করছেন?
Ignacio Vazquez-Abram

3
প্রস্থান আদেশটি আপনার টার্মিনাল সেশন / লগইনটি শেষ করা উচিত নয়। যদি আপনি exit 0সাফল্যের পরে স্ক্রিপ্টটি বন্ধ করতে ব্যবহার করেন, যখন আপনি প্রাক্তন স্ক্রিপ্টটি চালান: ./test.shআপনার আউটপুটটি দেখতে হবে তবে আপনার কনসোলটি উন্মুক্ত থাকবে।
বেন অ্যাশটন

আপনি shellকমান্ডটি ব্যবহার করতে পারেন , এটি আসলে একটি শেল টার্মিনাল খোলে। আমার নিজের অভিজ্ঞতাটি হ'ল এটি হ'ল না exit। প্রস্থানটি সাধারণত প্যারেন্ট স্ক্রিপ্টকে নিয়ন্ত্রণ ফিরিয়ে দেয়।
উইলেম ভ্যান অনসেম

উত্তর:


258

"সমস্যা" সত্যিই আপনি হ'ল আপনি স্ক্রিপ্টটি চালাচ্ছেন এবং চালাচ্ছেন না। আপনি যখন কোনও ফাইল উত্স উত্পন্ন করেন, তখন এর সামগ্রীগুলি একটি শ্যাশেল তৈরির পরিবর্তে বর্তমান শেলটিতে কার্যকর করা হবে। সুতরাং প্রস্থান সহ সমস্ত কিছুই বর্তমান শেলটিকে প্রভাবিত করবে।

ব্যবহারের পরিবর্তে exit, আপনি ব্যবহার করতে চাইবেন return


2
এখানে আরও একটি ব্যাখ্যা যা আমি সহায়ক পেয়েছি: Askubuntu.com/a/53179/148337
চিজওহিল

যদিও সঠিক, এটি দুর্দান্ত উত্তর নয়। এটি উপেক্ষা করে যে কলিং স্ক্রিপ্টটি এমন পরিবর্তনগুলি বা ফাংশনগুলি ডিক্লেয়ার করতে পারে যা স্ক্রিপ্টকে অ্যাক্সেসের প্রয়োজন হয়। কীভাবে কোনও রিটার্ন কোড সেট করা যায় এবং তারপরে runs.sh@ruakh এ এটি প্রক্রিয়া করা আরও ভাল এই প্রশ্নের উত্তরের উত্তর রয়েছে।
মাইকচিনকেলে

5
যদি ফাংশনটি নেস্টেড কল হয়? যেমন একটি কল খ, বি কল সি, সি অবিলম্বে একটি এবং খ থেকে প্রস্থান করতে চায়।
মাইকেল 22

উত্স প্রায় অনুলিপি অনুলিপি। এটি ব্যবহার করা ভাল sh <script>বা bash <script>যদি কোনও কোনও স্ক্রিপ্ট চালাতে এবং কোনও পর্যায়ে শেষ করতে চায়
পিটারচাউলা

42

হ্যাঁ; তুমি ব্যবহার করতে পারreturn পরিবর্তেexit । এর মূল উদ্দেশ্যটি শেল ফাংশন থেকে ফিরে আসা, তবে আপনি যদি এটি source-D স্ক্রিপ্টের মধ্যে ব্যবহার করেন তবে এটি সেই স্ক্রিপ্ট থেকে ফিরে আসে।

Bash4.1 হিসাবে বাশ রেফারেন্স ম্যানুয়ালটির "বোর্ন শেল বিল্টিনস" :

     return [n]

রিটার্ন মান এন দিয়ে শেল ফাংশন থেকে বেরিয়ে আসার কারণ দিন । যদি এন সরবরাহ না করা হয় তবে ফিরতি মান হ'ল ফাংশনে সম্পাদিত শেষ কমান্ডের প্রস্থান স্থিতি। এটি স্ক্রিপ্টের নির্বাহ স্থিতি হিসাবে স্ক্রিপ্টের মধ্যে সম্পাদিত শেষ কমান্ডের .( এন) বা শেষ কমান্ডের প্রস্থান স্থিতি দিয়ে (বা source) বিল্টিন দিয়ে সম্পাদিত কোনও স্ক্রিপ্টের সম্পাদন বন্ধ করতেও ব্যবহৃত হতে পারে । ফাঁদের সাথে যুক্ত যে কোনও কমান্ড কার্যকর করা হয় ফাংশন বা স্ক্রিপ্টের পরে এক্সিকিউশন পুনরায় শুরু হওয়ার আগে। কোনও ফাংশনের বাইরে ব্যবহার করা হয় এবং কোনও স্ক্রিপ্ট প্রয়োগের সময় বা দ্বারা ব্যবহৃত না হলে রিটার্নের স্থিতি শূন্য নয় ।RETURNreturn.source


3
returnশুধুমাত্র একটি ফাংশন থেকে ব্যবহার করা যেতে পারে। যদি আপনি returnএটি শেল স্ক্রিপ্ট হিসাবে ব্যবহার করেন এবং চালিত করেন (উদাহরণস্বরূপ sh run.sh), বাশ কোনও ত্রুটি হিসাবে রিপোর্ট করবে - return: can only কোনও ফাংশন বা উত্সাহিত স্ক্রিপ্ট থেকে 'প্রত্যাবর্তন'
জাজিংসিং ডেভিড ওয়াং

@ জাজানসিংস ডেভিডওয়ং: আপনি কি বুঝতে পেরেছেন যে এই উত্তরটির বেশিরভাগটি সরকারী রেফারেন্স ম্যানুয়াল থেকে উদ্ধৃতি? এবং যে ত্রুটি-বার্তাটি আপনি উদ্ধৃত করেছেন তা আপনার দাবির পরিবর্তে এই উত্তরটির সাথে একমত?
রুখ

আমি তোমার সাথে একমত নই আমি কেবল উল্লেখ করতে চাই যে returnস্ক্রিপ্টটি শেল স্ক্রিপ্ট হিসাবে চালিত হলে এবং সম্পাদিত না হলে কার্যকর হবে না। (বা source) বিটিডাব্লু, আমি কোথায় নথিটি পেতে পারি source -d?
জাজিংসিং ডেভিড ওয়াং

9

স্ক্রিপ্ট ব্যবহার করে চালানোর পরিবর্তে . run2.shআপনি এটি ব্যবহার করে sh run2.shবা চালাতে পারেনbash run2.sh

একটি নতুন সাব-শেল শুরু হবে, স্ক্রিপ্টটি চালানোর জন্য, অন্য শেলটি খোলা রেখে স্ক্রিপ্টের শেষে এটি বন্ধ হয়ে যাবে।


যদি তাই হয় তবে দ্বিতীয় প্যারামিটারটি কেন sh "." run2.sh?
চ্যান

@ এইচ 0ওয়ার্ড আপনি ঠিক বলেছেন আমি বিন্দুগুলি সরিয়ে দিতে ভুলে গেছি। আমি এখনই উত্তরটি সম্পাদনা করেছি।
ভাইওরেল মিরিয়া

1
ওপি স্পষ্টভাবে প্রয়োজন হিসাবে উত্সকে বলেছে।
জোনাথন নিউফিল্ড

3

আপনি রিটার্ন স্টেটমেন্ট / কমান্ডের পরে একটি অতিরিক্ত প্রস্থান কমান্ড যুক্ত করতে পারেন যাতে এটি উভয়ের পক্ষে কাজ করে, কমান্ড লাইন থেকে স্ক্রিপ্টটি সম্পাদন করে এবং টার্মিনাল থেকে সোর্সিং করে।

স্ক্রিপ্টে প্রস্থান কোডের উদাহরণ:

   if [ $# -lt 2 ]; then
     echo "Needs at least two arguments"
     return 1 2>/dev/null
     exit 1
   fi

exitকমান্ডের পরে যখন আপনি স্ক্রিপ্টটি উত্স করেন তখন কমান্ডের সাথে লাইন কল করা হবে না return

আপনি যখন স্ক্রিপ্টটি কার্যকর করেন, returnকমান্ড একটি ত্রুটি দেয়। সুতরাং, আমরা ত্রুটি বার্তাটিকে এগিয়ে পাঠিয়ে দমন করি /dev/null


3

আসলে, আমি মনে করি আপনি কীভাবে শান্ত করবেন সে সম্পর্কে আপনি বিভ্রান্ত হতে পারেন run a script

আপনি যদি shকোনও স্ক্রিপ্ট চালানোর জন্য ব্যবহার করেন তবে বলুন, sh ./run2.shএম্বেড হওয়া স্ক্রিপ্টটি যদি শেষ হয়exit , আপনার টার্মিনাল উইন্ডোটি এখনও থাকবে।

তবে আপনি যদি ব্যবহার করেন .বাsource , সাবস্ক্রিপ্ট শেষ হওয়ার সাথে সাথে আপনার টার্মিনাল উইন্ডোটি প্রস্থান / বন্ধ হবে।

আরও বিশদ জন্য, দয়া করে দেখুন shএবং ব্যবহারের মধ্যে পার্থক্য কি source?


2

এটি ঠিক যেমন আপনি আপনার স্ক্রিপ্ট run2.sh এর ভিতরে একটি রান ফাংশন রেখেছেন। ব্যাশ টিটিতে আপনার রান 2.sh ফাইলটি উত্স করার সময় আপনি রানের অভ্যন্তরে প্রস্থান কোড ব্যবহার করেন। যদি রানটি আপনার স্ক্রিপ্ট থেকে প্রস্থান করার জন্য রান ফাংশনটিকে শক্তি দেয় এবং রান 2.sh কে টার্মিনেটর থেকে প্রস্থান করার শক্তি দেয়। তারপরে রান ফাংশনে আপনার টেমিনেটর থেকে প্রস্থান করার ক্ষমতা রয়েছে।

    #! /bin/sh
    # use . run2.sh

    run()
    {
        echo "this is run"
        #return 0
        exit 0
    }

    echo "this is begin"
    run
    echo "this is end"

যাইহোক, আমি কাজ এর সাথে এটি অনুমোদনের জন্য এটি একটি ডিজাইনের সমস্যা।


এই উত্তরটি কী করার চেষ্টা করে তা পাঠ্য থেকে পরিষ্কার নয় তবে এটি অবশ্যই প্রশ্নটি হাতে এনে দেয় না।
Luís de Sousa

2

আমার একই সমস্যা ছিল এবং উপরের উত্তরগুলি থেকে এবং যা আমি বুঝতে পেরেছিলাম যা আমার জন্য চূড়ান্তভাবে কাজ করেছিল তা ছিল:

  1. একটি শিবাং লাইন রয়েছে যা উদ্দিষ্ট স্ক্রিপ্টকে ডাকে, উদাহরণস্বরূপ,

    #!/bin/bashbashস্ক্রিপ্টটি কার্যকর করতে ব্যবহার করে

আমার কাছে উভয় ধরণের শেবাংয়ের স্ক্রিপ্ট রয়েছে। এই কারণে, ব্যবহার shবা. নির্ভরযোগ্য ছিল না, কারণ এটি একটি ভুল-কার্যকরকরণের দিকে পরিচালিত করে (যেমন স্ক্রিপ্টটি অসম্পূর্ণভাবে চালিত হওয়ার আগে ব্যর্থ হয়)

উত্তর ছিল, তাই

    • স্ক্রিপ্টটিতে একটি শেবাং রয়েছে তা নিশ্চিত করুন, যাতে এটির উদ্দেশ্যযুক্ত হ্যান্ডলারটি সম্পর্কে কোনও সন্দেহ নেই।
    • .sh ফাইলটি chmod করুন যাতে এটি কার্যকর করা যায়। (chmod +x file.sh)
    • এটি কোনও shবা ছাড়াই সরাসরি ডেকে আনুন.

      (./myscript.sh)

আশা করি এটি একই রকম প্রশ্ন বা সমস্যা সহ কাউকে সহায়তা করে helps


1

আমি মনে করি যে এটি ঘটেছিল কারণ আপনি এটি বিন্দুর সাথে সোর্স মোডে চালাচ্ছেন

. myscript.sh

আপনার এটি একটি সাব-শেইলে চালানো উচিত:

/full/path/to/script/myscript.sh

'উত্স' http://ss64.com/bash/source.html


যদি . myscript.shকাজ করে তবে আপনার স্ক্রিপ্টের পুরো পথের দরকার নেই । সর্বাধিক, আপনার প্রয়োজন হতে পারে ./myscript.sh
vlvaro González

1

এটি সঠিক যে অন্যদের দ্বারা যেমন উল্লেখ করা হয়েছে, একই অধিবেশনটি উন্মুক্ত রাখতে সর্বাধিক সম্পাদিত স্ক্রিপ্টগুলি returnবনাম ব্যবহার করে correctexit

এখানে সম্পর্কিত কোনও টিপস, যদি আপনি কখনও এমন কোনও স্ক্রিপ্ট চান যা সেশনটি খোলা রাখা উচিত, তা নির্ধারিত হোক না কেন।

নিম্নলিখিত উদাহরণটি সরাসরি / foo.shমত সোর্স চালানো যেতে পারে । যেভাবেই এটি "প্রস্থান করার" পরে সেশনটি উন্মুক্ত রাখবে। স্ট্রিং ফাংশন বাইরের স্ক্রিপ্টের আর্গুমেন্ট অ্যাক্সেস আছে যাতে পাস করা হয়েছে।. foo.shsource foo.sh$@

#!/bin/sh
foo(){
    read -p "Would you like to XYZ? (Y/N): " response;
    [ $response != 'y' ] && return 1;
    echo "XYZ complete (args $@).";
    return 0;
    echo "This line will never execute.";
}
foo "$@";

টার্মিনাল ফলাফল:

oo foo.sh you
আপনি কি এক্সওয়াইজেড করতে চান? (ওয়াই / এন): এন
$ foo.sh X
আপনি XYZ করতে চান? (Y / N): n
$ |
(টার্মিনাল উইন্ডো খোলা থাকে এবং অতিরিক্ত ইনপুট গ্রহণ করে)

মূল exit/ returnযখন আপনি কাজ করছেন তার নীচে স্ক্র্যাপ কোডের একটি গোছা রেখে একক টার্মিনালে স্ক্রিপ্ট পরিবর্তনগুলি দ্রুত পরীক্ষার জন্য এটি দরকারী হতে পারে । এটি কোডটিকে এক অর্থে আরও পোর্টেবলও করে তুলতে পারে (যদি আপনার কাছে প্রচুর স্ক্রিপ্ট থাকে যা বিভিন্ন উপায়ে বলা যেতে পারে বা নাও পারে), যদিও এটি কেবলমাত্র ব্যবহার করা returnএবং exitযেখানে যথাযথভাবে উপযুক্ত তার চেয়ে অনেক কম ।


0

যদি আপনার টার্মিনাল এমুলেটরটি না থাকে তবে -holdআপনি কোনও সসেস স্ক্রিপ্ট স্যানিটাইজ করতে পারেন এবং টার্মিনালটি এটি সহ ধারণ করতে পারেন:

#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read

অন্যথায় আপনি ব্যবহার করতে পারেন $TERM -hold -e script


0

প্রত্যাশিত রিটার্ন মান সহ ফিরে আসার বিষয়টি নিশ্চিত করুন। অন্যথায় যদি আপনি প্রস্থানটি ব্যবহার করার সময় প্রস্থানটি ব্যবহার করেন তবে এটি আপনার বেস শেল থেকে প্রস্থান করবে কারণ উত্সটি অন্য কোনও প্রক্রিয়া (উদাহরণ) তৈরি করে না।


0

একটি স্ক্রিপ্ট যে হয় একটি শেল স্ক্রিপ্ট হিসাবে চালানো অথবা একটি RC ফাইল হিসাবে sourced করা নিরাপদ লিখতে, স্ক্রিপ্ট পরীক্ষা করতে পারবেন এবং তুলনা $0এবং $BASH_SOURCEএবং নির্ধারণ করে exitনিরাপদে ব্যবহার করা যাবে।

এখানে তার জন্য একটি সংক্ষিপ্ত কোড স্নিপেট

[ "X$(basename $0)" = "X$(basename $BASH_SOURCE)" ] && \
    echo "***** executing $name_src as a shell script *****" || \
    echo "..... sourcing $name_src ....."

-1

1) প্রস্থান 0 সফল হলে স্ক্রিপ্ট থেকে বেরিয়ে আসবে।

2) প্রস্থান 1 স্ক্রিপ্ট থেকে বেরিয়ে আসবে যদি এটি ব্যর্থ হয়।

আপনার উপর ভিত্তি করে এই দুটি চেষ্টা করতে পারেন আপনার উত্তর উপর ভিত্তি করে।

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