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


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.