সেট-ইউ ব্যবহার প্রত্যাশার মতো কাজ করছে না


12

আমি কীভাবে দক্ষতার setসাথে আমার স্ক্রিপ্টে বিভিন্ন অপশন ব্যবহার করব তা শিখছি এবং set -uভেরিয়েবলটি সঠিকভাবে সেট না হয়ে গেলে (উদাহরণস্বরূপ ব্যবহারকারীদের মুছে ফেলা) আমার স্ক্রিপ্ট থেকে বেরিয়ে আসার জন্য উপযুক্ত বলে মনে হচ্ছে। ম্যান পৃষ্ঠা অনুসারে , set -uএবং set -eনিম্নলিখিতগুলি করে ...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

এই কার্যকারিতাটি পরীক্ষা করার জন্য আমি একটি পরীক্ষার স্ক্রিপ্ট তৈরি করেছি, তবে এটি প্রত্যাশার মতো কাজ করছে বলে মনে হয় না। সম্ভবত কেউ আমার সম্পর্কে আমার সমস্যাটি আরও ভালভাবে ব্যাখ্যা করতে পারে এবং আমি কোথায় ভুল ব্যাখ্যা দিচ্ছি? টেস্ট স্ক্রিপ্ট নীচে। ধন্যবাদ.

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

আমি স্ক্রিপ্টটি 0 এবং "এটি কাজ করে" প্রদর্শিত হবে আশা করি এবং তারপরে ${testing2}সেট না করে ব্যর্থ হয় ।

পরিবর্তে আমি 0 এবং "এটি কাজ করে" প্রদর্শিত হয়, 0 এবং তারপরে 0 অনুসরণ করুন এটি প্রদর্শিত হবে না

কেউ কি কিছু জ্ঞান সরবরাহ করতে পারেন? ধন্যবাদ.


1
সুতরাং ফলোআপ ... নাল স্ট্রিংয়ে একটি ভেরিয়েবল সেট করে বেআইনীভাবে করার / ত্রুটি বাড়াতে কি কোনও উপায় আছে? আমি অনুমান করছি না।
লুক ডেভিস

উত্তর:


10

"ম্যান বাশ" থেকে:

একটি মান নির্ধারণ করা হলে একটি পরামিতি সেট করা হয় set নাল স্ট্রিং একটি বৈধ মান। একবার কোনও ভেরিয়েবল সেট হয়ে গেলে এটি আনসেট বিল্টিন কমান্ডটি ব্যবহার করেই আনসেট হতে পারে।

যখন আপনি testing2=নাল স্ট্রিংয়ে পরিবর্তনশীল সেট করা হয়।

এটিতে পরিবর্তন unset testing2করুন এবং আবার চেষ্টা করুন।


set -eহিসাবে একটি নিয়োগ 1. একজন প্রস্থান কোড দেখতে যে গত কমান্ড মৃত্যুদন্ড কার্যকর (নিয়োগ) এই চেষ্টা 0 একটি প্রস্থান কোড আছে, অথবা হয়েছে কখনো এই ক্ষেত্রে সাহায্য না এই প্রশ্নের পড়া :

$ false; a=""; echo $?
0

এবং আমি আরও বিশ্বাস করি যে সেট-ই ব্যবহার আরও একটি সমস্যা যা একটি সমাধান।

আনসেট ভেরিয়েবলগুলি ব্যবহার করে ত্রুটিটি কী পেতে পারে তা হ'ল set -u:

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

আউটপুট দেবে:

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

3

testing2=চলকটিকে testing2একটি খালি স্ট্রিংয়ে সেট করে ; পরিবর্তনশীল আসলে সেট করা হয়

তবে আপনি যদি echo $testing99ইন্টারেক্টিভ বাশ শেলটিতে চালিত হন (সেটিংস ছাড়াই errexit, অর্থাত্ set -e), আপনি একটি ত্রুটি পাবেন:

bash: testing99: unbound variable

সরাইয়া

এখনই স্ক্রিপ্টগুলি পরীক্ষা করার সময়, আমি আবিষ্কার করেছি যে একটি ইন্টারেক্টিভ শেল সর্বদা প্রবর্তিত হয় না যখন একটি ভেরিয়েবল প্রসারিত করার চেষ্টা করা হয় যা সেট করা হয়নি যখন একটি ইন্টারেক্টিভ শেল (শেল স্ক্রিপ্ট চালানো) সর্বদা প্রস্থান হয় । এর জন্য পসিএক্স ম্যান পৃষ্ঠা অনুসারে set:

-u শেলটি স্ট্যান্ডার্ড ত্রুটিতে একটি বার্তা লিখবে যখন এটি সেট না করে এমন একটি ভেরিয়েবল প্রসারিত করার চেষ্টা করবে এবং অবিলম্বে প্রস্থান করবে। একটি ইন্টারেক্টিভ শেলটি প্রস্থান করবে না।

একটি ইন্টারেক্টিভ ব্যাশ শেল থেকে প্রস্থান হবে না যদি না errexitহয়েছে আরো সেট করা। অন্যদিকে, একটি ইন্টারেক্টিভ ড্যাশ শেলটি প্রস্থান করবে না - যদিও set -eআগে চালানো হয়েছিল।


যদি ড্যাশ সেট-ই দিয়ে প্রস্থান না করে; সেট-ইউ; আনসেট আ; প্রতিধ্বনি, তবে ড্যাশ ভুল।
দক্ষভাবে

@ শচিলি যখন আমি প্রথম এটি লক্ষ্য করেছি, তখন আমি বুঝতে পেরেছিলাম যে ড্যাশ লেখকরা আমার চেয়ে আরও ভাল জানেন এবং পসিক্সের নির্দিষ্টকরণে কিছুটা অস্পষ্টতা থাকতে পারে তবে পাবস.ওপেনগ্রুপ.আর / অনলাইনেপবস / ৯৯৯৯৯৯799৯৯ / ইউটিলিটিস / আই, আমি পুনরায় চেক করেছি I ঠিক আছে যে একটি বাগ মত দেখায় সম্মত হন।
অ্যান্টনি জিওগেইগান

একটি সাধারণ নিয়ম রয়েছে: যখন কর্ন শেল এবং বোর্ন শেল উভয়ই একমত হয় এবং অন্য শেল প্রয়োগের একটি বিচ্যুতি ঘটে, তখন অন্য শেলটি ভুলভাবে আচরণ করে।
স্কিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.