কীভাবে `স্থানীয়কে প্রস্থান কোড ক্যাপচার করবেন?


11

আমার প্রকল্পে আমার কাছে নিম্নলিখিত স্নিপেট রয়েছে:

local output="$(bash "${1##*/}")"
echo "$?"

এটি সর্বদা শূন্য প্রিন্টের কারণে প্রিন্ট করে local, তবুও, অপসারণটি ভেরিয়েবলকে সঠিক আচরণের localকারণ দেয় $?: যা সাবশেল থেকে প্রস্থান কোডটি ধরে নেওয়া হয়।

আমার প্রশ্ন: আমি কীভাবে এই পরিবর্তনশীল স্থানীয় রাখতে পারি যখন প্রস্থানের মানটি ক্যাপচার করতে পারি?


1
shellcheckএই সমস্যাটি কেবলই ধরা দেবে না তবে সমাধানটি unix.stackexchange.com/a/281749/24718 এ পরামর্শ দেবে !
— ওয়ালিদ খান

উত্তর:


16
#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

এটি প্রতিধ্বনিত হবে 127, "কমান্ড পাওয়া যায়নি" এর জন্য সঠিক ত্রুটি কোড।

আপনি localএকাধিক ভেরিয়েবল সংজ্ঞায়িত করতে ব্যবহার করতে পারেন । সুতরাং আমি সফল হয়ে শূন্যে সেট করার RETআগে সাবশেলের প্রস্থান কোড ক্যাপচারের জন্য স্থানীয় ভেরিয়েবলটিও তৈরি করেছি ।local$?


bashএই অভিব্যক্তিটি বাম থেকে ডানদিকে মূল্যায়ন করা কি গ্যারান্টিযুক্ত ?
— সর্বাধিক Ried

যতদূর আমি অবগত, পরিবর্তনীয় অ্যাসাইনমেন্টগুলি যথাযথভাবে, এই প্রসঙ্গে বাম থেকে ডানে, হ্যাঁ।
— ডোপঘোটি

@ ম্যাক্সরিড এই সত্যটি নির্ভরযোগ্যভাবে কাজ করে যা ইঙ্গিত দেয় যে হ্যাঁ, এটিই। তবে আমি পসিক্স বা bashরেফারেন্স ম্যানুয়াল থেকে এটি সম্পর্কে কোনও তথ্য খুঁজে পাচ্ছি না ।
— বিড়াল

10
সরাইয়া হিসাবে, সমস্ত ক্যাপগুলি ভেরিয়েবলের নামগুলি ব্যবহার করা খারাপ ফর্ম। Pubs.opengroup.org/onlinepubs/009695399/basedefs/… এ পসআইএক্স এনভায়রনমেন্ট ভেরিয়েবল স্পেস দেখুন , যা শেল বা সিস্টেমের সাথে সম্পর্কিত এবং কমপক্ষে একটি ছোট-ছোট অক্ষরের অক্ষরের নামগুলির সাথে অক্ষরের জন্য সংরক্ষিত হিসাবে সমস্ত-বড়-বড় নামগুলি বর্ণনা করে অ্যাপ্লিকেশন-সংজ্ঞায়িত ব্যবহারের জন্য সংরক্ষিত, শেল ভেরিয়েবল এবং এনভায়রনমেন্ট ভেরিয়েবলগুলি একটি নেমস্পেস ভাগ করে রাখে (যেহেতু সংঘর্ষের ঘটনায়, প্রাক্তনাকে অর্পণ করা পরবর্তীটিকে ওভাররাইড করতে পারে)।
— চার্লস ডাফি

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
— টেরডন

27

স্থানীয় ভেরিয়েবলকে আপনি অর্পণ করার আগে এটিকে ঘোষণা করুন:

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

আমার মতে এটি অতিরিক্ত RETভেরিয়েবল সেট করার চেয়েও বেশি পঠনযোগ্য । এতে ওয়াইএমএমভি, তবে এটি আপনার প্রত্যাশার মতোই কাজ করে।


2
এটি পৃথক ভেরিয়েবল ব্যবহার করার চেয়ে অনেক ভাল, যদি আপনি একাধিক অ্যাসাইনমেন্টের রিটার্ন কোডটি পরীক্ষা করতে চান তবে স্পষ্ট হওয়া উচিত: কেবল local var1 var2 ...এবং বব আপনার মামা।
— l0b0

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