Does {{(প্রস্থান 1) কী করে; প্রস্থান 1; }; } মানে?


28

আমি পরবর্তী কোড স্নিপেট config.statusদ্বারা উত্পাদিত থেকে উদ্ধৃত configure

if test ! -f "$as_myself"; then
{ { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
{ (exit 1); exit 1; }; }
fi

কোড স্নিপেটে, কী করে { (exit 1); exit 1; };? কেবলমাত্র exitএকটি সাব-শেল করার উদ্দেশ্য কী ?

উত্তর:


33

ফাঁদ কার্যকর (exit 1);করার সহজ উপায় হ'ল কার্যকর করা ERRset -eকার্যকর হলে এটি তাত্ক্ষণিক প্রস্থানকে ট্রিগার করবে । (ত্রুটি শর্তটি ট্রিগার করতে ব্যর্থ হওয়ার জন্য একটি কমান্ড প্রয়োজন; exitসাব-শেলের একটি ব্যর্থতার সাথে সাবস্কেলটি ব্যর্থ হয়))

exit 1; এই জিনিসগুলির কোনটিই করবে না।

সুতরাং {(exit 1); exit 1;}প্রথমে ERRফাঁদ তৈরি করতে ব্যবহার করা যেতে পারে , যা ডিবাগিং উদ্দেশ্যে কার্যকর কিছু করতে পারে এবং এরপরে ত্রুটির ইঙ্গিত দিয়ে স্ক্রিপ্টটি শেষ করে।

কিন্তু autoconfফাইলগুলিতে যা চলছে তা নয় । autoconfস্ক্রিপ্টগুলি EXITরান চলাকালীন তৈরি অস্থায়ী ফাইলগুলি পরিষ্কার করার জন্য ফাঁদে ভরসা করে । বেশিরভাগ শেলগুলি, ফাঁদে কল দেওয়ার আগে কমান্ডের bashদেওয়া মান থেকে স্থিতি নির্ধারণ করে । এটি ফাঁদটিকে কোনও ত্রুটি থেকে বা সাধারণ অবসান থেকে ডেকে আনা হয়েছিল কিনা তা সনাক্ত করতে পারে এবং এটি ফাঁদ অপারেশনের শেষে প্রস্থান স্থিতি সঠিকভাবে সেট করা আছে কিনা তা নিশ্চিত করার অনুমতি দেয় toexitEXITEXIT

তবে দৃশ্যত কিছু শাঁস সহযোগিতা করে না। autoconfম্যানুয়ালটির একটি উদ্ধৃতি এখানে :

কিছু শেল স্ক্রিপ্ট যেমন উত্পাদিত autoconf, প্রস্থান করার আগে পরিষ্কার করার জন্য একটি ফাঁদ ব্যবহার করে। যদি সর্বশেষ শেল কমান্ডটি ননজারো স্ট্যাটাসের সাথে প্রস্থান করা হয়, তবে ফাঁদটি ননজারো স্ট্যাটাসের সাথে প্রস্থান করা হয় যাতে চালকটি বলতে পারে যে একটি ত্রুটি ঘটেছে।

দুর্ভাগ্যক্রমে, সোলারিসের মতো কয়েকটি শেলের মধ্যে /bin/shএকটি প্রস্থান ফাঁদ প্রস্থান কমান্ডের যুক্তি উপেক্ষা করে। এই শেলগুলিতে, কোনও ফাঁদ এটি নির্ধারণ করতে পারে না যে এটি সরল প্রস্থান বা প্রস্থান দ্বারা আহ্বান করা হয়েছিল 1 AC_MSG_ERROR.

কমান্ড কার্যকর হওয়ার আগে নির্ধারিত $?স্থিতি রয়েছে কিনা তা নিশ্চিত করে কাজটি করা হয়, যাতে ফাঁদ কার্যকর হওয়ার পরে অবশ্যই এটির মান থাকে । এবং, প্রকৃতপক্ষে, এটি ম্যাক্রো যা অদ্ভুত কোডটি সন্নিবেশ করিয়ে দেয়, অনর্থক ধনুর্বন্ধনী দিয়ে সম্পূর্ণ।exitEXITAC_MSG_ERROR


শুধু falseপরিবর্তে মৃত্যুদণ্ড দেওয়া হয় না কেন (exit 1)?
Ruslan

3
@ রুসলান: দুটি সমস্যা। (1) সর্বাধিক গুরুত্বপূর্ণ: falseআপনাকে স্থিতি কোডটি সেট করতে দেয় না এবং এটি কী শূন্য নয় এমন স্থিতি ফিরে আসার কোনও গ্যারান্টি নেই। (২) falseসাধারণত বিল্টিন নয়, তাই এটির জন্য একটি শিশু প্রক্রিয়া প্রয়োজন; বিপরীতে, বেশিরভাগ শাঁস কোনও শিশুকে পরিচালনা করতে পারে না (exit 1)
ধনী

8

আমি যতদূর দেখতে পাচ্ছি এর কোনও উদ্দেশ্য নেই, সাবস্কেল শুরু করে সরাসরি তাত্ক্ষণিকভাবে বের হয়ে সরাসরি এমন কিছু পাওয়া যায় না।

এর মতো জিনিসগুলি সম্ভবত কোডগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করার পক্ষে একটি পার্শ্ব প্রতিক্রিয়া - কিছু ক্ষেত্রে সাবসেলের মধ্যে অন্যান্য কমান্ড কার্যকর করা যেতে পারে যেখানে exit 1বোধগম্যতা রয়েছে। শেষ পর্যন্ত একটি ভাল সম্ভাবনা রয়েছে যে প্রজন্মের কোডটি কোনওভাবে কিছু বিবৃতি statementsোকানোর অনুমতি দিয়ে কিছুটা সরল করা হয়েছে যার পরিবর্তে কিছু ক্ষেত্রে কোনও ফাংশন নেই এবং প্রতিবারই 'ক্লিন কোড' উত্পন্ন করা আরও জটিল। হয় যেটি বা উপরে বর্ণিত কোডটি কেবল খারাপভাবে লেখা হয়েছে :)

উদার ব্যবহারের {...}এটির অন্য উদাহরণ, এর বেশিরভাগই অপ্রয়োজনীয়, তবে কোড লিখতে আরও সহজ যা তাদের প্রতিটি ক্ষেত্রে সন্নিবেশ করায় (সম্ভবত কিছুতে আপনি ব্লকের আউটপুট / ইনপুট পুনঃনির্দেশ করতে চান) পার্থক্য না করে যেখানে তাদের প্রয়োজন হয় না এবং এগুলি বাদ দিন।


এটির একটি উদ্দেশ্য রয়েছে। @ রিচি এর উত্তর দেখুন।
ওল্ড প্রো

1

(exit 1)একটি নির্দিষ্ট প্রস্থান কোড পাওয়ার জন্য একটি সহজ, সম্ভবত সবচেয়ে সহজ উপায় (1 এর বিশেষ ক্ষেত্রে অবশ্যই সহজ উপায় আছে অবশ্যই)। তবে প্রস্থান কোড পরীক্ষা না করা হওয়ায় এই ক্ষেত্রে এটি কারণ নয়।

exitএকটি সাব-শেল দেওয়ার উদ্দেশ্যটি স্ক্রিপ্ট থেকে প্রস্থান না করা (যদিও একটি নির্দিষ্ট প্রস্থান কোড তৈরির জন্য প্রস্থান ব্যবহার করা হয়)।

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