বাশের শর্তসাপেক্ষ প্রকাশে -a এবং -e এর পার্থক্য কী?


12

থেকে man bash:

CONDITIONAL EXPRESSIONS
[...]
       -a file
              True if file exists.
[...]
       -e file
              True if file exists.
  1. সুতরাং [ -a $FILE ]এবং [ -e $FILE ]যদি কোন পার্থক্য আছে ?
  2. যদি সত্যিকারের পার্থক্য না থাকে তবে একই উদ্দেশ্যে দুটি পতাকা কেন বিদ্যমান?

কেবলমাত্র বিকাশকারীরা # 2 --- জানতেন যদি না তারা তাদের যুক্তিটি সম্প্রদায়ের সাথে ভাগ করে না নেয়।
বেলমিন ফার্নান্দেজ

উত্তর:


13

ইন bash, দুটি আর্গুমেন্ট প্রসঙ্গে testকমান্ড, -a fileএবং -e fileএকই। তবে তাদের কিছু পার্থক্য রয়েছে, কারণ -aএটি বাইনারি অপারেটরও।

-eUnary POSIX দ্বারা সংজ্ঞায়িত করা হয়, কিন্তু -aunary নয়। পসিক্স কেবল -aবাইনারি সংজ্ঞায়িত করে ( পরীক্ষা পসিক্স দেখুন )।

POSIX তিনটি আর্গুমেন্ট testআচরণ নির্ধারণ করে:

3 টি যুক্তি:

  • যদি $ 2 বাইনারি প্রাথমিক হয় তবে $ 1 এবং $ 3 এর বাইনারি পরীক্ষা করুন।

  • যদি $ 1 হ'ল '!', তবে $ 2 এবং $ 3 এর দ্বি-যুক্তির পরীক্ষাটি উপেক্ষা করুন।

  • যদি $ 1 হয় '(' এবং $ 3 হল ')', তবে $ 2 এর অবিচ্ছিন্ন পরীক্ষা করুন। যেসব সিস্টেমে এক্সএসআই বিকল্প সমর্থন করে না, তাদের ক্ষেত্রে ফলাফলগুলি অনির্ধারিত থাকে যদি $ 1 হয় '(' এবং $ 3 হয় ')'।

  • অন্যথায়, অনির্দিষ্ট ফলাফল উত্পাদন করুন।

সুতরাং -aএছাড়াও অদ্ভুত ফলাফল বাড়ে:

$ [ ! -a . ] && echo true
true

-aতিনটি যুক্তি প্রসঙ্গে বাইনারি অপারেটর হিসাবে বিবেচিত হয়। দেখুন ব্যাশ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী প্রশ্ন ই 1-aপক্সিক্সে উল্লেখ করা হয়েছে যে কর্নশেল থেকে প্রাপ্ত তবে পরে পরিবর্তিত হয়েছিল -eকারণ এটি -aবাইনারি এবং ইউনিারিগুলির মধ্যে বিভ্রান্তিকর হয়ে পড়ে -a

সি-শেল দ্বারা সরবরাহিত অনুরূপ কার্যকারিতা সম্বলিত -e প্রাথমিকটি যুক্ত করা হয়েছিল কারণ এটি শেল স্ক্রিপ্টের জন্য ফাইলটি খোলার চেষ্টা না করে কোনও ফাইল উপস্থিত রয়েছে কিনা তা খুঁজে পাওয়ার একমাত্র উপায় প্রদান করে। যেহেতু বাস্তবায়নগুলি অতিরিক্ত ফাইল প্রকার যুক্ত করার অনুমতি দেয় তাই পোর্টেবল স্ক্রিপ্টটি ব্যবহার করতে পারে না:

পরীক্ষা-বি ফু -ও -সি ফু-ও -ডি-ফু-ও -ফ ফু-ও -পি ফু

foo একটি বিদ্যমান ফাইল কিনা তা খুঁজে বের করার জন্য। BSতিহাসিক বিএসডি সিস্টেমে কোনও ফাইলের অস্তিত্ব নির্ধারণ করা যেতে পারে:

পরীক্ষা - foo -o -d foo

তবে বিদ্যমান ফাইলটি নিয়মিত ফাইল ছিল তা নির্ধারণের জন্য সহজ উপায় ছিল না। প্রাথমিক প্রস্তাবে কর্নশেল-প্রাথমিক ব্যবহার করা হয়েছিল (একই অর্থ সহ) তবে এটি পরিবর্তন করে -e করা হয়েছিল কারণ মানুষের উচ্চ সম্ভাবনা সম্পর্কে একটি বাইনারি অপারেটরের সাথে -a প্রাথমিককে বিভ্রান্ত করার বিষয়ে উদ্বেগ রয়েছে।

-aবাইনারি এছাড়াও অপ্রচলিত হিসাবে চিহ্নিত করা হয়, কারণ এটি কিছু অস্পষ্ট অভিব্যক্তি বাড়ে, যার মধ্যে 4 টিরও বেশি আর্গুমেন্ট রয়েছে। এই> 4 টি আর্গুমেন্ট এক্সপ্রেশন দিয়ে, পসিক্স সংজ্ঞা দেয় ফলাফল অনির্ধারিত।


কুল জেনে নিন! এবার এটি আরও স্পষ্ট :)!
পলিম

9

.1। তাহলে [-a $ ফাইল] এবং [-e $ ফাইল] এর মধ্যে পার্থক্য কী?

কোনও পার্থক্য নেই।

লাইনে 505-507মধ্যে test.cব্যাশ সংস্করণের 4.2.45(1)-release:

case 'a':           /* file exists in the file system? */
case 'e':
  return (sh_stat (arg, &stat_buf) == 0);

এটি ইঙ্গিত দেয় যে উভয় পতাকা মধ্যে সত্যিকারের পার্থক্য নেই।

.2। যদি সত্যিকারের পার্থক্য না থাকে তবে একই উদ্দেশ্যে দুটি পতাকা কেন বিদ্যমান?

দেখুন gnouc এর উত্তর।


3
অন্যদিকে, প্রদত্ত যে উপর -aহয় এছাড়াও একটি বুলিয়ান অপারেটর (এবং) ব্যাশ, এটা বাগ এই অতিরিক্ত অর্থ পুরোপুরি অপ্রয়োজনীয় যোগ করার জন্য প্রবণ বলে মনে হয়; আমি চাই এটা আরো সামঞ্জস্য সঙ্গে সম্পর্কযুক্ত কিছু অন্যান্য বাস্তবায়ন এবং / অথবা পূর্ববর্তী সংস্করণে ছিল না যে তার সাথে সামঞ্জস্য থেকে -e
celtschk

@celtschk - এটি বাগপ্রোন নয়, তবে শেলের পার্সার হতে পারে। পসিক্স এর জন্য -aএবং -oবুলিয়ানগুলি নির্দিষ্ট করে [ test ]। কিন্তু কিছু শেল (যেমন bash) কোনও অপারেটরের কাছ থেকে একটি যুক্তি আলাদা করে চুষে ফেলেছিল এবং [ test ]ফলাফলগুলি অবিশ্বাস্য। তার পর থেকে পসিক্সের দরকার হয়েছে যে কোনও অনুগত শেল [ test ]বন্ধনীগুলির মধ্যে কমপক্ষে 4 টি আর্গুমেন্ট হ্যান্ডেল করা উচিত ।
মাইকজার্ভ

5

স্ট্যাকওভারফ্লো প্রশ্ন থেকে আমি সবচেয়ে ভাল উত্তরটি পেয়েছি:

-aহ্রাস করা হয়েছে, সুতরাং /usr/bin/testআর ম্যানপেজের জন্য তালিকাভুক্ত নয়, তবে ব্যাশের জন্য এখনও একটিতে। ব্যবহার -e। একক '[' - এর জন্য, ব্যাশ বিল্টিন ব্যাশ বিল্টিনের মতোই আচরণ করে test, যা একইরকম আচরণ করে /usr/bin/[এবং /usr/bin/test (একটি অন্যটির সাথে একটি সিমলিংক))। -aএর অবস্থানের উপর নির্ভর করে এর প্রভাবটি নোট করুন : এটি শুরুতে থাকলে এর অর্থ file exists। যদি এটি দুটি অভিব্যক্তির মাঝে থাকে তবে এর অর্থ যৌক্তিক and

[ ! -a /path ] && echo existsব্যাশ ম্যানুয়ালটি যেহেতু -aসেখানে বাইনারি অপারেটর হিসাবে বিবেচিত তা কাজ করে না , এবং সুতরাং উপরেরটি একটি হিসাবে নয় negate -a ..তবে if '!' and '/path' is true(খালি নয়) হিসাবে বিভক্ত হয় না । সুতরাং, আপনার স্ক্রিপ্ট সর্বদা আউটপুট "-a"(যা আসলে ফাইলগুলির জন্য পরীক্ষা করে), এবং "! -a"যা আসলে andএখানে বাইনারি ।

কারণ [[, আর -aবাইনারি হিসাবে ব্যবহৃত হয় andনা ( &&সেখানে ব্যবহৃত হয়), তাই এর অনন্য উদ্দেশ্যটি সেখানে কোনও ফাইলের জন্য পরীক্ষা করা (যদিও অবমূল্যায়ন করা হচ্ছে)। সুতরাং, অবহেলা আসলে আপনি যা প্রত্যাশা করেন তা করে।

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