পৃথক কমান্ডের জন্য সেট-ই কীভাবে অক্ষম করবেন?


36

কোনও কমান্ড শূন্য-বহির্গমন প্রস্থান কোড ফেরত দিলে সেট-কমান্ডটি বাশ স্ক্রিপ্টটি তত্ক্ষণাত ব্যর্থ করে দেয়।

  1. কোনও স্ক্রিপ্টের মধ্যে স্বতন্ত্র কমান্ডের জন্য এই আচরণটি অক্ষম করার জন্য কি সহজ এবং মার্জিত উপায় আছে?

  2. বাশ রেফারেন্স ম্যানুয়াল ( http://www.gnu.org/software/bash/manual/bashref.html ) এ কার্যকারিতাটি কোন জায়গায় নথিবদ্ধ করা আছে ?

উত্তর:


29
  1. এটার মতো কিছু:

    #!/usr/bin/env bash
    
    set -e
    echo hi
    
    # disable exitting on error temporarily
    set +e
    aoeuidhtn
    echo next line
    
    # bring it back
    set -e
    ao
    
    echo next line

    চালান:

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
  2. এটি setবিল্টিন হেল্পে বর্ণনা করা হয়েছে :

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.

এখানে একই নথিভুক্ত করা হয়েছে: https://www.gnu.org/software/bash/manual/bashref.html# দ্য- সেট- বুলেটিন


ধন্যবাদ! আমি আরও একটি সম্ভাবনা পেয়েছি: #! / Bin / bash set -e # সেট-ই প্রভাবটি দেখতে পরবর্তী লাইনে কমেন্ট করা: # ব্লাব যদি ব্লাব; তারপরে প্রতিধ্বনি "কমান্ড ব্লাবটি সফল ছিল" " অন্যথায় প্রতিধ্বনি "কমান্ড ব্লাব ব্যর্থ হয়েছে code প্রস্থান কোড: $?" ফাই প্রতিধ্বনি সাধারণ স্ক্রিপ্টের প্রস্থান
গুস্তেভ

22

ত্রুটির ভিত্তিতে জামিন আনসেট করার বিকল্প হ'ল কোনও সাফল্যই বাধ্য করা। আপনি এর মতো কিছু করতে পারেন:

cmd_to_run || true

এটি 0 (সত্য) ফিরে আসবে, সুতরাং সেট-টি ট্রিগার করা উচিত নয়


3
faulty_cmd || :এটির জন্য আরও একটি জনপ্রিয় প্রতিমা। ( :এটি একটি কমান্ড যার সমার্থক শব্দ true)।
ulidtko

3
@ulidtko - আকর্ষণীয়। আমাকে শশকের গর্ত নিচে নেতৃত্বে এই এটি stackoverflow.com/questions/3224878/... সত্য বনাম ইতিহাস পেতে:
Ernie

12

আপনি যদি রিটার্ন / ত্রুটি কোড (ফাংশন বা কাঁটাচামচ) ধরার চেষ্টা করছেন তবে এটি কাজ করে:

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

8

যদি "প্রস্থান অবিলম্বে শেল বিকল্প" প্রয়োগ করা হয় বা এড়ানো হয় তবে এটি নির্বাহিত কমান্ডের প্রসঙ্গে নির্ভর করে ( সেট বিল্টিনে বাশ রেফারেন্স ম্যানুয়াল বিভাগটি দেখুন - আরকাদিউজ ড্রাবসিজিককে ধন্যবাদ)।

বিশেষত, যদি একটি কমান্ড যদি একটি বিবৃতিতে পরীক্ষার অংশ হয় তবে বিকল্পটি উপেক্ষা করা হবে। সুতরাং একটি কমান্ড কার্যকর করা সম্ভব হবে এবং "সাফ করুন তাত্ক্ষণিক প্রসঙ্গে" এর মধ্যে যদি এই জাতীয় বিবৃতি ব্যবহার করে এর সাফল্য বা ব্যর্থতা পরীক্ষা করা যায়:

#!/bin/bash

set -e

# Uncomment next line to see set -e effect:
#blubb

if blubb; then
  echo "Command blubb was succesful."
else 
  echo "Command blubb failed. Exit code: $?"
fi
echo "Script exited normally."

"তারপর" বিবৃতিটি বাদ দেওয়া এবং কম লাইন ব্যবহার করা সম্ভব:

if blubb; then :;
else echo "Command blubb failed. Exit code: $?"; fi

2

আরেকটি পদ্ধতির, যা আমি মোটামুটি সোজা জানি (এবং setএটি ছাড়াও অন্যান্য বিকল্পের ক্ষেত্রেও প্রযোজ্য -e):

$-সেটিংস পুনরুদ্ধার করতে ব্যবহার করুন ।

উদাহরণ স্বরূপ:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

যদিও -eসুনির্দিষ্টরূপে, অন্যরা মেন্টিনড অপশনগুলি ( || trueবা "একটি if" ভিতরে রাখে ) আরও মূর্খবাদী হতে পারে।


0

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

#!/bin/sh

args=""
for argcol in $*
do
    args="${args} ${argcol}"
done
fortunevar=""
fortfail=""
{
    set +e
    fortunevar=`fortune $args`
    fortfail=$?
    set -e
} &> /dev/null
if [ $fortfail == 0 ]
then
    echo ${fortunevar}
    say ${fortunevar}
else
    echo misfortune: an illegal option was detected!
    echo misfortune: usage: misfortune [-afilosw] [-m pattern][ [#%] file/directory/all]
fi

এটি 'ভাগ্য' এর আউটপুট ধরে এবং এর প্রস্থান স্থিতি পরীক্ষা করে এবং প্রতিধ্বনিত করে এবং বলে। আমি মনে করি এটিই আপনি যা চেয়েছিলেন, বা কমপক্ষে অনুরূপ কিছু? যাইহোক, আশা করি এটি সাহায্য করবে।


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

0

অস্থায়ীভাবে কিছু পরিবর্তন করতে চাইলে আমি সাবশেল শুরু করতে চাই। নীচের কমান্ডটি দেখায় যে প্রথম খারাপ_কম্যান্ড উপেক্ষা করা হয় এবং দ্বিতীয়টি কার্যকরভাবে বাতিল হয়।

bash -c 'set -e ;\
( set +e; bad_command ; echo still here ) ;\
echo even here ; \
bad_command ; \
echo but not here;'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.