কেন এটি উত্সাহ দেওয়ার আগে ফাইল অস্তিত্ব জন্য পরীক্ষা?


13

কোনও ফাইল উত্স করার চেষ্টা করার সময়, আপনি কি ফাইলটি বিদ্যমান নেই বলে ত্রুটি চান না যাতে আপনি কী ঠিক করতে জানেন?

উদাহরণস্বরূপ, এনভিএম এটি আপনার প্রোফাইলে / আরসিতে যুক্ত করার পরামর্শ দেয়:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

উপরের সাথে, যদি nvm.shউপস্থিত না থাকে তবে আপনি একটি "নীরব ত্রুটি" পেয়ে যাবেন। আপনি চেষ্টা করলে . "$NVM_DIR/nvm.sh", আউটপুট হবে FILE_PATH: No such file or directory


3
আপনার উচিত হবে না। এটা বুদ্ধিমান। উত্সটি চেষ্টা করুন তারপর ত্রুটিটি হ্যান্ডেল করুন, যদি কোনও হয়
মাইকেল

2
@ মাইকেল ঠিক আছে! তাহলে আমি কেন সব জায়গায় দেখতে পাচ্ছি?
জেবালিন

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

8
@FaheemMitha এটা কখনোই ভাল প্রথম অস্তিত্বের বার করো। পরিস্থিতি পরীক্ষা এবং ব্যবহারের মধ্যে পরিবর্তিত হতে পারে, উভয় মিথ্যা ধনাত্মক এবং মিথ্যা নেতিবাচক ফল দেয়: এবং এখনও আপনাকে ব্যবহারের ক্ষেত্রে ব্যর্থতাটি পরিচালনা করতে হবে। এবং আপনি যেমন পারফরম্যান্স উল্লেখ করেছেন, ব্যবহারের আগে পরীক্ষা করাই স্বাভাবিকভাবে দ্বিগুণভাবে ধীরে ধীরে ধীরে ধীরে না করায় এবং সিস্টেমটিকে এটি করতে দেয়, এটি যেভাবেই করতে চলেছে। এটা হতে পারে না।
ব্যবহারকারী 207421

1
@ সিমনরিখটার, এই ক্ষেত্রে এনভিএম কাজ করবে না। ব্যবহারকারীরা ফাইলটি নিজেরাই অনুপস্থিত তা খুঁজে বের করতে হবে।
জেবালিন

উত্তর:


25

পসিক্স শেলগুলিতে, .একটি বিশেষ অন্তর্নির্মিত, সুতরাং এটির ব্যর্থতার ফলে শেলটি প্রস্থান হতে পারে (কিছু শেলের মতো bashএটি পসিক্স মোডে থাকলেই হয়)।

ত্রুটি হিসাবে কী যোগ্য হয় তা শেলের উপর নির্ভর করে। ফাইলটি বিশ্লেষণের সময় তাদের বাক্যগুলি সিন্ট্যাক্স ত্রুটি থেকে বেরিয়ে আসে না তবে সর্বাধিক ফাইলটি খুঁজে পাওয়া যায় না বা খোলা না গেলে বেশিরভাগ প্রস্থান করতে পারে। আমি জানতে পারি না যে উত্সাহিত ফাইলের শেষ কমান্ডটি শূন্য-বহির্গমন স্থিতি (যদি errexitবিকল্পটি অবশ্যই না থাকে) দিয়ে ফিরে আসে তবে শেষ হতে পারে।

এখানে করছেন:

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

এমন একটি ঘটনা যেখানে আপনি যদি ফাইলটি সেখানে উপস্থিত থাকে তবে এটি উত্স করতে চান, এবং এটি না থাকলে না (বা এখানে খালি রয়েছে -s)।

অর্থাৎ, ফাইলটি না থাকলে এটিকে ত্রুটি হিসাবে বিবেচনা করা উচিত নয় (POSIX শেলগুলিতে মারাত্মক ত্রুটি) that ফাইলটিকে একটি alচ্ছিক ফাইল হিসাবে বিবেচনা করা হয়।

ফাইলটি যদি পাঠযোগ্য না হয় বা ডিরেক্টরি ছিল বা (কিছু শেলের মধ্যে) পার্স করার সময় একটি সিনট্যাক্স ত্রুটি ছিল যা এটি অবশ্যই রিপোর্ট করা উচিত It

কেউ কেউ বলবেন যে রেসের শর্ত আছে। কিন্তু শুধু এটা মানে হবে যে শেল একটি ত্রুটির কথা থেকে প্রস্থান করবে ফাইলের মধ্যে সরানো হয় [এবং ., কিন্তু আমি এটা একটি ত্রুটি বিবেচনা যে এই নির্দিষ্ট পাথ ফাইল হঠাৎ বিলুপ্ত হতে পার, অথচ স্ক্রিপ্ট হয় বৈধ নয় তর্ক করা চাই চলছে।

অন্য দিকে,

command . "$NVM_DIR/nvm.sh" 2> /dev/null

যেখানে the কমান্ডের বিশেষ বৈশিষ্ট্যটিকে commandসরিয়ে দেয় (যাতে এটি ত্রুটিযুক্ত শেল থেকে বের হয় না) এটি কাজ করবে না:.

  • এটির .ত্রুটিগুলি লুকাতে পারে তবে উত্সযুক্ত ফাইলটিতে চালিত কমান্ডগুলির ত্রুটিও hide
  • এটিতে ভুল অনুমতি থাকা ফাইলের মতো প্রকৃত ত্রুটি শর্তও লুকিয়ে রাখে।

অন্যান্য সাধারণ বাক্য গঠন (উদাহরণস্বরূপ দেবি grep -r /etc/default /etc/init*স্ক্রিপ্টগুলির জন্য দেবিয়ান সিস্টেমগুলিতে দেখুন যা রূপান্তরিত systemdহয়নি এখনও (যেখানে EnvironmentFile=-/etc/default/serviceপরিবর্তে environmentচ্ছিক পরিবেশ ফাইল নির্দিষ্ট করতে ব্যবহৃত হয়)) এর মধ্যে রয়েছে:

  • [ -e "$file" ] && . "$file"

    এটিতে থাকা ফাইলটি পরীক্ষা করে দেখুন, খালি থাকলেও উত্সটি দিন। এটি খুলতে না পারলে এখনও মারাত্মক ত্রুটি (যদিও এটি সেখানে রয়েছে, বা সেখানে ছিল)। আপনি আরও বৈকল্পিক দেখতে পাবেন [ -f "$file" ](যেমন বিদ্যমান এবং এটি একটি নিয়মিত ফাইল), [ -r "$file" ](পঠনযোগ্য) এবং এর সমন্বয়গুলি।

  • [ ! -e "$file" ] || . "$file"

    কিছুটা উন্নত সংস্করণ। এটি পরিষ্কার করে দেয় যে ফাইলটি বিদ্যমান নেই এটি একটি ওকে কেস। এর অর্থ এটিও হ'ল $?শেষ কমান্ডের প্রস্থান স্থিতিটি প্রতিফলিত হবে $file(পূর্ববর্তী ক্ষেত্রে, আপনি যদি পেয়ে যান তবে আপনি 1জানেন না যে এটি $fileউপস্থিত ছিল না কারণ বা সেই আদেশটি ব্যর্থ হয়েছে)।

  • command . "$file"

    ফাইলটি সেখানে থাকার প্রত্যাশা করুন, তবে এটি ব্যাখ্যা করতে না পারলে প্রস্থান করবেন না।

  • [ ! -e "$file" ] || command . "$file"

    উপরের সংমিশ্রণ: ফাইলটি না থাকলে এটি ঠিক আছে, এবং পসিক্স শেলগুলির জন্য, ফাইলটি খুলতে (বা পার্স) করতে ব্যর্থতার খবর পাওয়া গেছে তবে তা মারাত্মক নয় (যার জন্য এটি আরও কাঙ্ক্ষিত হতে পারে ~/.profile)।


¹ দ্রষ্টব্য: zshতবে, আপনি অনুকরণে commandনা থাকলে shএমনটি ব্যবহার করতে পারবেন না ; নোট করুন যে কর্ন শেলের sourceমধ্যে আসলে একটি অ্যালাম command ., একটি অ-বিশেষ বৈকল্পিক.


মজাদার! আমি পসিক্স sh সম্পর্কে এটি জানতাম না। কিন্তু প্রশ্ন ছিল .bash_profile। আমি দুঃখিত চেয়ে ভাল নিরাপদ অনুমান, তবে কি কখনও পসিক্স মোডে বাঁশ যখন .bash_profileউত্সাহিত হয়?
মাইকেল

(আমি বুঝতে পেরেছি যে আপনি প্রশ্নের উত্তর এনভিএম উত্স লিঙ্কটি পড়ার ভিত্তিতে সমস্ত পসিক্স শেলগুলিতে আরও বিস্তৃতভাবে প্রয়োগ হিসাবে এই প্রশ্নের ব্যাখ্যা করতে পারেন।)
মাইকেল

@ মাইকেল, আমার উত্তরটি এখনও পসিক্স bashমোডে না থাকলে প্রযোজ্য । আপনি চাইবেন [ -e /file ] && . /fileযদি আপনি ফাইলটি উপস্থিত না থাকায় এটিকে ত্রুটি হিসাবে বিবেচনা না করেন। ব্যবহার করে দেখুন উৎস তারপর, ত্রুটি হ্যান্ডেল যদি থাকে এখানে সম্পন্ন করা যাবে না।
স্টাফেন চেজেলাস

1
@ মাইকেল, এটি পাল্টা উত্পাদনকারী। 1) যা পসিএক্স শেলগুলি (বা পসিএক্স মোডে ব্যাশ) 2 দিয়ে ত্রুটিযুক্ত হয়ে প্রস্থানটি রোধ করে না, যা ত্রুটি বার্তাকে নকল করে (স্টাডাউটে আপনার), .ইতিমধ্যে একটি ত্রুটির প্রতিবেদন করবে (স্ট্যাডারে)। এবং যদি ফাইলটি উপস্থিত না থাকে তখন উদ্দেশ্যটি যদি এটিকে ত্রুটি হিসাবে বিবেচনা না করে, তবে এটি সঠিক নয় (এবং এটি সম্ভব নয়, প্রস্থান স্থিতি থেকে .ব্যর্থ হয়েছে কিনা তা জানাতে কারণ ফাইলটি উপস্থিত ছিল না বা পাঠযোগ্য ছিল না, বা ছিল পার্সেবল নয়, বা শেষ কমান্ডটি ব্যর্থ হয়েছে) যা আমি এই উত্তরে এখানে তৈরি করছি।
স্টাফেন চেজেলাস

1
জাতি অবস্থা থেকে সম্মান সঙ্গে - এটা ব্যর্থ লগ ইনের জন্য একটি সমস্যা এই প্রোগ্রামটিতে অনেক কম একবার লগইন ব্যর্থ চেয়ে (সময় কিছু অদ্ভুত সিস্টেমে ঘটছে) ধারাবাহিকভাবে (এমনকি যদি কিছু আছে ব্যবহারকারীর কনফিগ নেই-বেশ-ডান -নথি পত্র). সুতরাং এই চেকটিতে একটি রেসের শর্তটি চেকটি না পেয়ে এখনও উন্নতি।
রুখ

5

nvmএর প্রতিক্রিয়া রক্ষণাবেক্ষণকারী :

কেবল ফাইল মুছে দিয়ে এনভিএম আনইনস্টল করা সহজ; অতিরিক্ত কাজ জোর করা (যেখানে লাইন (গুলি) সেই উত্স এনভিএম হয় তা সন্ধান করতে) বিশেষ মূল্যবান বলে মনে হয় না।

আমার ব্যাখ্যা (স্টাফেনের দুর্দান্ত ব্যাখ্যা এবং কুসালানন্দের মন্তব্যের সাথে মিলিত):

এটি সহজ এবং নিরাপদ।

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


1
আমি আপনার ব্যাখ্যার বিরোধিতা করছি যে এটি "শিক্ষানবিশদের লক্ষ্য"। এটা প্রতিরক্ষামূলক। আপনি চান না যে কোনও ব্যবহারকারীর লগইন শেলটি শুরুতে অপ্রত্যাশিতভাবে শেষ হতে পারে কারণ কেবলমাত্র সেই ফাইলটি অনুপস্থিত ( যে কোনও কারণেই হোক )। যদি কোডটির লাইনটি শেল ইন্ডি ফাইলগুলির মধ্যে একটিতে থাকে /etc, তবে এটি কিছু ব্যবহারকারীদের কাছে ফাইল রয়েছে এবং কারও কাছে ফাইল নেই। আইএমএইচও, nvmরক্ষণাবেক্ষণকারীদের প্রতিক্রিয়া কেবল একটি দিককেই স্পর্শ করছে।
কুসালানন্দ

1

হিসাবে JBallin এবং Stéphane Chazelas POSIX শাঁস মধ্যে নির্দিষ্ট করেছি,, একটি ফাইল ব্যর্থ লগ ইন কারণ হবে বিদ্যমান নয় যে গুন।

তবে ফাইলটি বিদ্যমান কিনা তা পরীক্ষা করে যোগ করার পরে উত্সের চেষ্টা করার ফলে এটি রেসের শর্ত বলে কিছু হতে পারে। কিছু পরিবর্তন nvm.shমধ্যবর্তী [ -s nvm.sh ]এবং . nvm.sh, এটা ঠিক বাগ তারা আরো অনেক কিছু খুব কমই যদিও, প্রতিরোধ করার চেষ্টা করছেন কারণ হবে।

সাধারণভাবে, বর্ণের পরিস্থিতি প্রতিরোধের উপায়টি হল আপনি যা করতে চান তার চেষ্টা করা, তবে যদি ব্যর্থ হয় তবে ত্রুটিটি পরিচালনা করুন, যেমন

. "$NVM_DIR/nvm.sh" || echo "Sourcing $NVM_DIR/nvm.sh failed" >&2

এটি পসিক্স শেলগুলিতে কাজ করে না এটি প্রমাণিত হয়েছে, কারণ উপরের মতো, .ব্যর্থতা হ'ল কোনও ত্রুটি পরিচালনা পরিচালনা করার আগে শেলটি তত্ক্ষণাত্ প্রস্থান করবে।

আমার উত্তরটি যুক্তি দেয় যে পসিএক্স শেলগুলি এই প্রশ্নের সাথে প্রাসঙ্গিক নয়, কারণ .bash_profileকখনও পসিক্স মোডে চলবে না। সুতরাং আমরা ঠিক উপরের কোড যাইহোক করতে পারি।

সবচেয়ে নিরাপদ হওয়ার জন্য, আমরা নিশ্চিত করতে পারি যে পসিক্স মোডটি কার্যকর নয়, বা /unix//a/383581/3169 তে বর্ণিত কৌশলটি ব্যবহার করে পসিক্স মোডটি অক্ষম করা আছে তা নিশ্চিত করতে পারি ।

স্টাফেনের উত্তরে সমস্ত পসিক্স শেল কীভাবে পরিচালনা করতে হবে তার জন্য কিছু দরকারী পরামর্শ রয়েছে যা আমি মনে করি এনভিএম লেখকের উদ্দেশ্য, তবে এখানে যে প্রশ্নটি জিজ্ঞাসা করছিল তার চেয়ে সম্পূর্ণ আলাদা ছিল, যার কারণে আপনার লক্ষ্য কী তার উপর নির্ভর করে আমাদের একাধিক সম্ভাব্য পন্থা রয়েছে ।

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