আমি ইআরআর এবং এক্সিট ফাঁদগুলির সাথে set -e
( errexit
), set -u
( nounset
) ব্যবহার করার সময় কিছু অদ্ভুত আচরণ পর্যবেক্ষণ করছি । এগুলি সম্পর্কিত বলে মনে হচ্ছে, সুতরাং তাদের একটি প্রশ্নের মধ্যে রাখা যুক্তিসঙ্গত বলে মনে হয়।
1) set -u
ERR ফাঁদগুলি ট্রিগার করে না
কোড:
#!/bin/bash trap 'echo "ERR (rc: $?)"' ERR set -u echo ${UNSET_VAR}
- প্রত্যাশিত: ERR ট্র্যাপটি কল হয়ে যায়, আরসি! = 0 0
- আসল: ERR ফাঁদ বলা হয় না , আরসি == 1
- দ্রষ্টব্য:
set -e
ফলাফল পরিবর্তন করে না
2) set -eu
এক্সিট ট্র্যাপে প্রস্থান কোডটি ব্যবহার করা 1 এর পরিবর্তে 0 হয়
কোড:
#!/bin/bash trap 'echo "EXIT (rc: $?)"' EXIT set -eu echo ${UNSET_VAR}
- প্রত্যাশিত: এক্সিট ট্র্যাপটি কল হয়ে যায়, আরসি == 1
- আসল: এক্সিট ট্র্যাপ বলা হয়, আরসি == 0
- দ্রষ্টব্য: ব্যবহারের সময়
set +e
, আরসি == ১। অন্য কোনও কমান্ড ত্রুটি ছুঁড়ে ফেললে এক্সিট ট্র্যাপ যথাযথ আরসি দেয়। - সম্পাদনা: এই বিষয়টিতে একটি আকর্ষণীয় মন্তব্য সহ একটি এসও পোস্ট রয়েছে যা এটি বাশ সংস্করণটি ব্যবহৃত হচ্ছে সম্পর্কিত হতে পারে বলে পরামর্শ দেয়। এই স্নিপেটটি বাশ ৪.৩.১১ এর সাথে পরীক্ষার ফলে আরসি = 1 আসে that's দুর্ভাগ্যক্রমে সমস্ত হোস্টে বাশকে (৩.২.৫১ থেকে) আপগ্রেড করা এই মুহুর্তে সম্ভব নয়, সুতরাং আমাদের আরও কিছু সমাধান নিয়ে আসতে হবে।
এই আচরণগুলির যে কেউ ব্যাখ্যা করতে পারে?
এই বিষয়গুলি অনুসন্ধান করা খুব একটা সফল ছিল না, যা বাশ সেটিংস এবং ফাঁদে পোস্টগুলির সংখ্যা দিয়ে অবাক করা অবাক করা। এখানে একটি ফোরামের থ্রেড রয়েছে , তবে উপসংহারটি বরং অসন্তুষ্টিজনক।
set -e
এবং set -u
উভয়ই বিশেষভাবে স্ক্রিপ্টেড শেলটি মারার জন্য ডিজাইন করা হয়েছে । তাদের অ্যাপ্লিকেশন ট্রিগার করতে পারে এমন পরিস্থিতিতে তাদের ব্যবহার করা একটি স্ক্রিপ্ট শেলকে হত্যা করবে । এগুলি ব্যবহার না করা এবং পরিবর্তে যখন তারা কোনও কোড ক্রম প্রয়োগ করে তখন এই শর্তগুলির জন্য পরীক্ষা করে নেওয়া ছাড়া এটির কোনও লাভ নেই । সুতরাং, মূলত, আপনি ভাল শেল-কোড লিখতে পারেন, বা আপনি ব্যবহার করতে পারেন set -eu
।
-u
ইআরআর ফাঁদটি কেন ট্রিগার করবে না সে সম্পর্কে পর্যাপ্ত তথ্য আমি পাইনি (এটি একটি ত্রুটি, সুতরাং এটি ফাঁদটি ট্রিগার করা উচিত নয়) বা ত্রুটি কোডটি 1 এর পরিবর্তে 0 হয় The পরের সংস্করণে ইতিমধ্যে ঠিক করা হয়েছে এমন একটি বাগ বলে মনে হচ্ছে, তাই। তবে প্রথম অংশটি বোঝা বেশ কঠিন যদি আপনি বুঝতে না পারেন যে শেল মূল্যায়নের ত্রুটিগুলি (প্যারামিটার সম্প্রসারণ) এবং কমান্ডগুলিতে প্রকৃত ত্রুটি দুটি পৃথক জিনিস বলে মনে হচ্ছে। সমাধানের জন্য, ভাল, আপনি যেমন পরামর্শ দিয়েছিলেন, আমি এখন এড়াতে চেষ্টা করছি -eu
এবং এটির প্রয়োজন হলে ম্যানুয়ালি পরীক্ষা করতে চাই।
(set -u; : $UNSET_VAR)
এবং অনুরূপ প্রসঙ্গে রূপান্তরিত করা যেতে পারে । এই ধরণের জিনিসগুলি খুব ভাল হতে পারে - আপনি &&
মাঝেমধ্যে প্রচুর পরিমাণে ফেলে দিতে পারেন:, (set -e; mkdir dir; cd dir; touch dirfile)
আপনি যদি আমার ড্রিফ্ট পান। এটি ঠিক যেগুলি নিয়ন্ত্রিত প্রসঙ্গগুলি - আপনি এগুলি বিশ্বব্যাপী বিকল্প হিসাবে সেট করার পরে আপনি নিয়ন্ত্রণ হারাবেন এবং নিয়ন্ত্রিত হয়ে উঠবেন। যদিও সাধারণত আরও কার্যকর সমাধান থাকে।
bash
হয় স্ট্যান্ডার্ডটি ভেঙে সাব্হেলগুলিতে ফাঁদ ফেলতে শুরু করে। কোথা থেকে ফিরে এসেছিল সেই ফাঁদটি একই পরিবেশে কার্যকর হওয়ার কথা, তবেbash
কিছুক্ষণের জন্য তা করেননি।