পরে জন্য প্রস্থান কোড সংরক্ষণ করুন


15

সুতরাং আমি কিছু পরীক্ষা চালানোর জন্য একটি ছোট স্ক্রিপ্ট আছে।

javac *.java && java -ea Test
rm -f *.class

এখন এই সঙ্গে সমস্যা হল যখন আমি স্ক্রিপ্টটি রান হয় ./test, এটি একটি সাফল্য প্রস্থান কোড এমনকি যদি পরীক্ষা ব্যর্থ কারণ ফিরে আসতে হবে rm -f *.classসফল।

আমি যা করতে চাই তা করার জন্য এটি করার একমাত্র উপায় আমার কাছে কুরুচিপূর্ণ মনে হয়:

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi

তবে এটি একটি সাধারণ সমস্যার মতো বলে মনে হচ্ছে - কোনও কার্য সম্পাদন করুন, পরিষ্কার করুন, তারপরে মূল টাস্কের প্রস্থান কোডটি ফিরিয়ে দিন।

এটি করার সর্বাধিক অভিহিত পদ্ধতি কোনটি (সাধারণত বাশ বা সাধারণ শাঁসে)?

উত্তর:


5

আপনি এগুলি exitএবং rmকমান্ডগুলি একটি একক সাধারণ-কমান্ডের evalমতো করে মোড়ানো করতে পারেন:

java ... && java ...
eval "rm -f *.class; exit $?"

যেভাবে $?পাস করার সময় এর মান exitতা যা তাড়াতাড়ি evalরান করার আগে নির্ধারিত হয় ।


evalসর্বদা একটি ভক্ত-প্রিয়।
মাইক্রজারভ

23

আমি সাথে যেতে হবে:

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
exit "$test_exit_code"

কেন exitপাওয়া যায় কাছাকাছি লাফ ?


আপনি এটি ব্যবহার করতে পারেন trap:

trap 'last_error_code=$?' ERR

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

$ trap 'last_error_code=$?' ERR
$ false
$ echo $?
1
$ echo $last_error_code $?
1 0

আহ আমি এটি আমার মূল চেয়ে ভাল সম্মত। তবে এটি এখনও সন্তোষজনক বোধ করে যে আমাকে বহির্গমনটিতে স্পষ্টভাবে প্রস্থান কোডটি সংরক্ষণ করতে হবে। একটি প্রস্থান কোড 'ধাক্কা' দেওয়ার জন্য এবং এটিকে আবার 'পপ' করার কোনও উপায় নেই?
math4tots

@ math4tots আপডেট চেষ্টা করুন।
মুড়ু

সুতরাং আপনার আপডেটের সাথে আমি শেষ_আরর_কোডটি শূন্যে আরম্ভ করতে হবে এবং তারপরে শেষে ফিরে আসতে হবে যাতে কোনও কমান্ড যদি ত্রুটি ছুঁড়ে ফেলে তবে আমার শূন্য-বহির্গমন কোডটি থাকবে? এটি একটি দুর্দান্ত কৌশল, তবে আমার দুটি লাইন হ্যাক স্ক্রিপ্টের জন্য, আমি মনে করি আমি @ মাইক্রোসভারের উত্তরটিকে পছন্দ করি।
math4tots

@ math4tots আপনি সর্বদা করতে পারেন exit ${last_error_code:=0}
মুড়ু

@ অ্যাভিপ যাইহোক? এটি ইতিমধ্যে একক উদ্ধৃতিতে রয়েছে, সুতরাং ফাঁদটি যখন ডাকা হয় তখন কেবল ভেরিয়েবলটি মূল্যায়ন করা হয়।
মুরু

9

যতদূর আমি জানি যে কাছের জিনিসটি ব্যাশের try...finallyআরও সি-জাতীয় প্রোগ্রামিং ভাষা থেকে একটি ব্লক রয়েছে (এটি সম্ভবত আপনি যদি এটি উপলব্ধ থাকতেন তবে এটিই চাইত) এটি trapনির্মাণ, যা এইভাবে কাজ করে:

trap "rm -f *.class" EXIT
javac *.java && java -ea Test

আপনার স্ক্রিপ্টটি প্রস্থান করার পরে এটি "rm -f * .class" চালায়। যদি আপনার আরও জটিল কিছু করার থাকে তবে আপনি এটি কোনও ফাংশনে রাখতে পারেন:

cleanup() {
    ...
}
trap cleanup EXIT
javac *.java && java -ea Test

আপনি যদি এত ঝুঁকে থাকেন তবে আপনি এটিকে মোটামুটি সাধারণ প্রতিমা হিসাবে রূপান্তর করতে পারেন যা try...catch...finallyসি এর ব্লকের মতো মোটামুটিভাবে কাজ করে Some

(
  trap "catch_block; exit" ERR
  trap finally_block EXIT
  # contents of try goes here
)

নোট করুন যে প্রথম বন্ধনী একটি সাব-শেল সীমানা; এই নির্মাণের সাথে, যদি কোনও কমান্ড পুরোপুরি স্ক্রিপ্ট না হয়ে যায় তবে কেবলমাত্র সাবশেলটি প্রস্থান করবে। মনে রাখবেন সাবশেলগুলি কিছুটা গণনা ব্যয়বহুল তাই তাদের মধ্যে খুব বেশি (শত) ব্যবহার করবেন না। আপনার স্ক্রিপ্টের উপর নির্ভর করে আপনি শেল ফাংশনগুলির সাথে আরও দক্ষতার সাথে একই প্রভাব অর্জন করতে সক্ষম হতে পারেন trap ... RETURN, তবে এটি তদন্ত করা আপনার পক্ষে up

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