"ব্যাশ-ই" ব্যবহার করার সময় আমি কীভাবে একটি সাবশেলের আউটপুট এবং প্রস্থান মূল্য পেতে পারি?


70

নিম্নলিখিত কোড বিবেচনা করুন

outer-scope.sh

#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("

inner-scope.sh

#!/bin/bash
function inner() { echo "winner"; return 1; }

আমি outer-scope.shকলটি inner()ব্যর্থ হলে প্রস্থান করার চেষ্টা করছি । যেহেতু $()একটি উপ-শেল আহবান করে, এটি ঘটে না।

কোনও শূন্য-বহির্গমন কোডের সাহায্যে ফাংশনটি প্রস্থান হতে পারে এই সত্যটি সংরক্ষণ করে আমি কীভাবে কোনও ফাংশনের আউটপুট পেতে পারি?

উত্তর:


102

$()প্রস্থান স্থিতি সংরক্ষণ করে; আপনাকে কেবল একটি বিবৃতিতে এটি ব্যবহার করতে হবে যার কোনও নিজস্ব কোনও স্থিতি নেই, যেমন একটি অ্যাসাইনমেন্ট।

আউটপুট = $ (ভিতরের)

এর পরে, $?এর প্রস্থান স্থিতি থাকবে innerএবং আপনি এর জন্য সব ধরণের চেক ব্যবহার করতে পারেন:

output=$(inner) || exit $?
echo $output

বা:

if ! output=$(inner); then
    exit $?
fi
echo $output

বা:

if output=$(inner); then
    echo $output
else
    exit $?
fi

(দ্রষ্টব্য: exitতর্ক ছাড়াই একটি খালি সমান exit $?- এটি হ'ল এটি সর্বশেষ কমান্ডের প্রস্থান স্থিতির সাথে প্রস্থান করে I আমি দ্বিতীয় ফর্মটি কেবল স্পষ্টতার জন্য ব্যবহার করেছি))


এছাড়াও, রেকর্ডের জন্য: sourceএই ক্ষেত্রে সম্পূর্ণ সম্পর্কিত নয়। আপনি শুধু বর্ণনা করতে পারেন inner()মধ্যে outer-scope.shফাইল, একই ফলাফল সঙ্গে।


এটা কেন, যদিও $? $ () এর প্রস্থান স্থিতি রয়েছে যা স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে প্রস্থান করে না (প্রদত্ত যে -টি সেট করা আছে)? সম্পাদনা: কিছুই নয়, আমার মনে হয় আপনি আমার প্রশ্নের উত্তর দিয়েছেন, ধন্যবাদ!
জাবলসাদ

আমি নিশ্চিত নই. (আমি উপরের কোনটি পরীক্ষা করে দেখিনি।) তবে -তে কিছু নিষেধাজ্ঞাগুলি রয়েছে, সমস্তই বাশের ম্যানপেজে ব্যাখ্যা করা হয়েছে; এছাড়াও, যদি আপনি echo $()এটি সম্পর্কে জিজ্ঞাসা করছেন , তবে এটি হতে পারে কারণ লাইন - echoকমান্ড - এর নিজস্ব একটি প্রস্থান কোড (সাধারণত 0) থাকলে সাবহেলগুলির প্রস্থান কোডগুলি উপেক্ষা করা হবে ।
মাধ্যাকর্ষণ

1
হুম, যখন আমি টাইপ if ! $(exit 1) ; then echo $?; fi, আমি পেতে 0ifআপনার যদি সেই প্রস্থান মূল্যটি সংরক্ষণ করার প্রয়োজন হয় তবে নিশ্চিত উপায় নয় ।
রন বার্ক

@ গ্রায়েটি - এটি ড্যাশ দিয়ে কাজ করে? আমি কিছু বিরক্তিকর অটোকনফ আচরণের সাথে কাজ করার চেষ্টা করছি (যথা, সান বা আইবিএম-এর সংকলক টার্মিনালে অবৈধ বিকল্প প্রিন্ট করলে অটোকনফ সাফল্যের প্রতিবেদন করে)।
jww

3
if ! output=$(inner); then exit $?; fi0 এর রিটার্ন কোড সহ প্রস্থান করবে কারণ $?রিটার্ন কোডের !পরিবর্তে রিটার্ন কোড দেবে inner। আপনি পছন্দসই আচরণটি পেতে পারেন if output=$(inner); then : ; else exit $?; fiতবে এটি স্পষ্টতই আরও
ভার্জোজ

26

দেখুন BashFAQ / 002 :

যদি আপনি উভয়ই চান (আউটপুট এবং প্রস্থান স্থিতি):

output=$(command)
status=$? 

একটি বিশেষ মামলা

ফাংশন স্থানীয় ভেরিয়েবলগুলির সাথে একটি জটিল ক্ষেত্রে নোট করুন, নিম্নলিখিত কোডটি তুলনা করুন:

f() { local    v=$(echo data; false); echo output:$v, status:$?; }
g() { local v; v=$(echo data; false); echo output:$v, status:$?; }

আমরা পাবো:

$ f     # fooled by 'local' with inline initialization
output:data, status:0

$ g     # a good one
output:data, status:1

কেন?

localভেরিয়েবলটি আরম্ভ করার জন্য যখন সাব-শেলের আউটপুট ব্যবহার করা হয় , প্রস্থান স্থিতি আর সাব-শেলের নয়, তবে কমান্ডের , যা সম্ভবত সবচেয়ে বেশি ।local 0

Https://stackoverflow.com/a/4421282/537554 এও দেখুন


3
যদিও এটি সত্যই প্রশ্নের উত্তর দেয় নি, এটি আজ আমার পক্ষে কার্যকর হয়েছে, সুতরাং +1।
ফোরস্পাস্টমিডনাইট

1
ব্যাশ কমান্ডের জন্য প্রস্থান স্থিতি সর্বদা শেষ আদেশটি কার্যকর করা হয় is আমরা যখন প্রবলভাবে টাইপ করা ভাষায় এত সময় ব্যয় করি তখন সহজেই ভুলে যাওয়া সহজ যে "স্থানীয়" কোনও ধরণের নির্দিষ্টকরণকারী নয়, কেবল অন্য একটি কমান্ড। এখানে এই পয়েন্টটি পুনরাবৃত্তি করার জন্য ধন্যবাদ, আজ আমাকে সাহায্য করেছে।
বিপণনকারী

2
বাহ, আমি এখনই এই সঠিক সমস্যাটি নিয়ে চলেছি এবং আপনি এটি পরিষ্কার করেছেন cleared ধন্যবাদ!
krb686

4
#!/bin/bash
set -e
source inner-scope.sh
foo=$(inner)
echo $foo
echo "I thought I would've died :("

যোগ করে echo, সাবশেল একা দাঁড়ায় না (পৃথকভাবে চেক করা হয় না) এবং গর্ভপাত বন্ধ করে দেয় না। অ্যাসাইনমেন্ট এই সমস্যাটিকে পরিস্কার করে।

আপনি এটিও করতে পারেন এবং আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে পারেন, এটি পরে প্রক্রিয়া করার জন্য।

tmpfile=$( mktemp )
inner > $tmpfile
cat $tmpfile
rm $tmpfile

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