কোনও কমান্ড সফল হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


234

কমান্ড কার্যকর করতে কোনও ত্রুটি আছে কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?

উদাহরণ:

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

আমি ইতিমধ্যে এটি করার চেষ্টা করেছি তবে মনে হয় এটি কাজ করছে না। আমি কিভাবে এটি না।


9
Back (foo) ব্যাকটিক্সের চেয়ে পছন্দ করুন `foo` , কারণ আপনি এটি নীড় করতে পারেন, এবং অ্যাডোস্ট্রোফেস থেকে পৃথক করা আরও সহজ।
ব্যবহারকারী অজানা

1
বিটিডাব্লু, আপনাকে কোনও ফাংশন validকল করার আগে এটি নির্ধারণ করতে হবে ( )।
wjandrea

উত্তর:


344

রিটার্ন মান সংরক্ষণ করা হয় $?। 0 সাফল্যের ইঙ্গিত দেয়, অন্যরা ত্রুটি নির্দেশ করে।

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

অন্য যে কোনও পাঠ্যগত মানের মতো, আপনি এটিকে ভবিষ্যতের তুলনার জন্য একটি পরিবর্তনশীলতে সঞ্চয় করতে পারেন:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

সম্ভাব্য তুলনা অপারেটরগুলির জন্য, দেখুন man test


খুব সুন্দর ... আমি কি আউটপুট ত্রুটি ধরে রাখতে পারি ?? !! , কারণ এই ক্ষেত্রে আমার 2 ত্রুটি রয়েছে: কমান্ড ত্রুটি "পাঠ্য" প্রাক্তন, ফাইল পাওয়া যায় নি এবং আমার ত্রুটি "পাঠ্য" যা এই ক্ষেত্রে রয়েছে তা উদাহরণস্বরূপ ব্যর্থ হয়েছে
moata_u

@ মোটা_উ: আমার উত্তরে দেখানো হিসাবে আপনি মানটি একটি চলকতে সঞ্চয় করতে পারেন।
লেকেনস্টেইন

@ মোটা_উ: আপনাকে এর ;আগে একটি রাখা দরকার elseএবং fi: put যদি ...; তারপরে ...; অন্যথায় ...; ফাই
লেকেনস্টেইন


1
@ ব্লাউহিরন [ $? ](বা সমতুল্য test $?) কাজ করে না কারণ $?কোনও সংখ্যার (0, 1 ইত্যাদি) মূল্যায়ন যা বাতিল নয় ull এর জন্য দস্তাবেজগুলিtest দেখুন : "যদি এক্সপ্রেসনটি বাদ দেওয়া হয় তবে 'পরীক্ষা' মিথ্যা প্রত্যাবর্তন করে EX
লেকেনস্টেইন

87

কমান্ডটি সফল হয়েছে বা ব্যর্থ হয়েছে কিনা তা যদি আপনার কেবল জানতে প্রয়োজন $?, পরীক্ষার বিরক্ত করবেন না , সরাসরি কমান্ডটি সরাসরি পরীক্ষা করুন। উদাহরণ:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

এবং একটি ভেরিয়েবলের আউটপুট বরাদ্দ করা রিটার্নের মান পরিবর্তন করে না (ভাল, স্টাডাউট যখন টার্মিনালটি টার্মিনাল না হয় তখন এটি অন্যরকম আচরণ করে)।

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionalsif আরও বিশদে ব্যাখ্যা করে।


আপনি যদি ডাব্লুআইনিতে ব্যর্থ হন বা না হন তবে বুলেয়ান সংরক্ষণের মতো শাখাগুলি ব্যতীত অন্য কিছু করতে চান? তারপরে আপনার আউটপুট ভেরিয়েবলটি এটি করে না, তবে $?তা করে so সুতরাং আপনি কমান্ডটি সরাসরি পরীক্ষা করা আরও কঠোর saying
টিমোথি সোয়ান

আউটপুটটিকে একটি ভেরিয়েবলে বরাদ্দ করা রিটার্নের মান পরিবর্তন করতে পারে যখন কেউ localকমান্ড ব্যবহার local foo=$(false); echo $?;করে , অর্থাৎ 0আউটপুটে উত্পাদন করে। তবে localব্যাশ ফাংশনগুলির মধ্যে এটি কেবল প্রাসঙ্গিক।
ক্রোম্যাক্স

26
command && echo OK || echo Failed

যদি commandস্ক্রিনে ত্রুটি ফিরে আসে তবে কীভাবে এটি লুকিয়ে রাখবেন?
সিগুর

তাহলে commandstderr হবে আউট ত্রুটি লিখছেন, আপনি কি ফর্মটি ব্যবহার করতে পারেন command 2> /dev/null && echo OK || echo Failed2> /dev/nullপুনঃনির্দেশ আউটপুট stderr /dev/null। তবে কিছু ইউটিলিটি স্টাডাউটে ত্রুটি লিখবে (যদিও এটি খারাপ অভ্যাস)। এই ক্ষেত্রে আপনি পুনঃনির্দেশ থেকে 2 বাদ দিতে পারেন, তবে আপনি কমান্ড থেকে কোনও আউটপুট হারাবেন। সাফল্য যাচাই করার এই পদ্ধতিটি সাধারণ ত্রৈমাসিক যুক্তির পক্ষে ভাল তবে আরও জটিল আচরণের $?জন্য কমান্ড সাফল্যের জন্য যাচাই করা ভাল , বা if@ গিরির উত্তরে বর্ণিত ব্লক পদ্ধতিটি ব্যবহার করা ভাল ।
পানোত্সব গরিষ্ঠ

17

$? পূর্ববর্তী কমান্ডের প্রস্থান স্থিতি থাকা উচিত যা কোনও ত্রুটির জন্য শূন্য হওয়া উচিত।

সুতরাং, মত কিছু;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

বেশিরভাগ ক্ষেত্রে, একে অপরের উপর নির্ভর করা দরকার এমন চেইন কমান্ডগুলির জন্য && কনস্ট্রাক্ট ব্যবহার করা আরও সহজ। সুতরাং সাফল্যের প্রতিধ্বনি cd /nonexistant && echo success!হবে না কারণ &&& এর আগে কমান্ডটি ভেঙে যায়। এই সম্পুরক || কোথায় cd /nonexistant || echo fail হবে ব্যর্থ echo কারণ সিডি ব্যর্থ হয়েছে। (আপনি যদি || প্রস্থানের মতো কিছু ব্যবহার করেন তবে এটি কার্যকর হয় যা পূর্ববর্তী আদেশটি ব্যর্থ হলে স্ক্রিপ্টটি শেষ করবে))


খুব সুন্দর ... আমি কি আউটপুট ত্রুটি ধরে রাখতে পারি ?? !! , কারণ এই ক্ষেত্রে আমার 2 ত্রুটি রয়েছে: কমান্ড ত্রুটি "পাঠ্য" প্রাক্তন, ফাইল পাওয়া যায় নি এবং আমার ত্রুটি "পাঠ্য" যা এই ক্ষেত্রে রয়েছে তা উদাহরণস্বরূপ ব্যর্থ হয়েছে
moata_u

@ মোটা_উ, দেখুন mywiki.wooledge.org/BashFAQ/002
গিরিহা

5
command && echo $? || echo $?

মানে command; echo $??
জাভিয়ের বুজী

না, আমার লাইনটি সঠিক, এটি সাফল্য বা ব্যর্থতা নির্বিশেষে সংখ্যা হিসাবে প্রকৃত ফলাফল কোড দেয়।
Modrobert

1
ঠিক আছে, দয়া করে আমাকে এইগুলির পার্থক্যগুলি ব্যাখ্যা করুন: true && echo $? || echo $?/ true; echo $?এবং false && echo $? || echo $?/ false; echo $?- আপনি খুঁজে পাবেন, তারা ঠিক একই জিনিসটি করবে: ডি
জাভিয়ের বুজি

হ্যাঁ, একই ফলাফল তবে শর্ত ছাড়াই। মূল প্রশ্নটি জিজ্ঞাসা করা হয়েছিল "কমান্ড সফল হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?", এটি পূর্ববর্তী উত্তরের উপর ভিত্তি করে ছিল। আমি অনুমান করি এর চেয়ে ভাল উদাহরণটি command && echo "success: $?" || echo "fail: $?"
হ'ল

5

এটি লক্ষ করা উচিত যে if...then...fiএবং &&/ ||প্রকারের পদ্ধতির সাথে প্রস্থান স্থিতির সাথে সম্পর্কিত আদেশটি আমরা আদেশ দিয়ে ফিরে এসেছি (সাফল্যে 0); তবে, কমান্ড ব্যর্থ হলে বা ইনপুট নিয়ে কাজ করতে না পারলে কিছু কমান্ড একটি শূন্য-বহির্গমন স্থিতি ফিরিয়ে দেয় না। এর অর্থ হ'ল স্বাভাবিক ifএবং &&/ ||পদ্ধতিগুলি সেই নির্দিষ্ট কমান্ডগুলির জন্য কাজ করে না।

উদাহরণস্বরূপ, লিনাক্সে জিএনইউ file0 দিয়ে এখনও প্রস্থান করে যদি এটি কোনও অস্তিত্বযুক্ত ফাইলকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং findনির্দিষ্ট করা ফাইল ব্যবহারকারী সনাক্ত করতে না পারে।

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

এই ক্ষেত্রে, একটি সম্ভাব্য আমরা যেভাবে পরিস্থিতি হ্যান্ডেল পারে পড়া হয় stderr/ stdinবার্তা, যেমন ঐ যে দ্বারা ফিরে fileকমান্ড বা মত কমান্ডের আউটপুট পার্স find। যে উদ্দেশ্যে, caseবিবৃতি ব্যবহার করা যেতে পারে।

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(এটি ইউনিক্স.স্ট্যাকেক্সেক্সঞ্জ ডটকম-এ সম্পর্কিত প্রশ্নে আমার নিজের উত্তরটির পুনরায় পোস্ট )


1

অন্যান্য অনেক উত্তরে যেমন উল্লেখ করা হয়েছে, এর মতো একটি সাধারণ পরীক্ষা $?করবে

if [ $? -eq 0 ]; then something; fi

কমান্ডটি ব্যর্থ হয়েছে কিনা তা যদি আপনি পরীক্ষা করতে চান তবে আপনি bashনিম্নরূপে (তবে সম্ভবত ওভারকিল) একটি সংক্ষিপ্ত সংস্করণ ব্যবহার করতে পারেন :

if (($?)); then something; fi

এটি (( ))পাটিগণিত মোড ব্যবহার করে কাজ করে , সুতরাং যদি কমান্ডটি ফিরে আসে success, $? = 0তবে পরীক্ষাটি ((0))কোন পরীক্ষার হিসাবে পরীক্ষা করে তা মূল্যায়ন করে false, অন্যথায় এটি ফিরে আসবে true

সাফল্যের জন্য পরীক্ষা করতে , আপনি এটি ব্যবহার করতে পারেন:

if ! (($?)); then something; fi

তবে এটি ইতিমধ্যে প্রথম উদাহরণের চেয়ে কম নয়।


1
গঠনমূলক সমালোচনা?
আফুন

0

আপনার আদেশগুলি প্রমাণ করার সময় ত্রুটির জন্য :

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

চর্বি উত্পাদনতে অনুপ্রাণিত :


-2

যদি [$ (আদেশ)]; তারপরে "সাফল্য" প্রতিধ্বনি করুন; ফাই


3
trueসফল হয় if [ $(true) ]; then echo "succeed"; fiতবে succeedমুদ্রিত হয় না। আসলে এটি commandসফল হয় কিনা তা কখনই পরীক্ষা করে না । এটি ঠিক গিরির পোস্টেif command যেমন ব্যবহার করা উচিত । হয় কমান্ড প্রতিকল্পন । একটি হল শর্তাধীন অভিব্যক্তি । অনুপস্থিত শব্দ বিভাজন এবং ফাইলের নাম সম্প্রসারণ , আউটপুট থাকলে এটি মূলত পরীক্ষা করে । $( )[ ]command
এলিয়াহ কাগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.