আমাকে এর মতো নন-বেস স্ক্রিপ্ট (যথা পিএইচপি স্ক্রিপ্ট) থেকে বেশ কয়েকটি পাইপযুক্ত শেল কমান্ড প্রয়োগ করতে হবে:
command1 | command2 | command3
যাতে, যদি command1
কোনও শূন্য-বহির্গমন কোডের সাথে ব্যর্থ হয় তবে একে অপরের কমান্ডও ব্যর্থ হয়। এতক্ষণ, আমি যা নিয়ে এসেছি তা হ'ল:
set -o pipefail && command1 | command2 | command3
এটি টার্মিনাল থেকে সূক্ষ্মভাবে চালিত হলেও, স্ক্রিপ্ট থেকে সম্পাদন করা হলে এটি তৈরি করে:
sh: 1: set: অবৈধ বিকল্প -o পাইপফেইল
/bin/sh set -o pipefail
এটি চালায় তখন বলে /bin/sh: 0: Can't open set
(একই জিনিসটি sudo
)। আশা করি আমি এটি সঠিকভাবে পরীক্ষা করেছি। সিস্টেমটি উবুন্টু 12.
/bin/sh -c "set -o pipefail"
; যেমনটি ছিল, শেলটি বর্তমান ডিরেক্টরিটিতে বলা একটি স্ক্রিপ্ট কার্যকর করার চেষ্টা করছে set
এবং এটি এটি খুঁজে পেল না।
/bin/sh -c "set -o pipefail"
কাজ করছেন না, তবে bash -c "set -o pipefail"
তা করে।
/bin/sh
যা স্বীকৃতি দেয় না set -o pipefail
। ফলস্বরূপ, আপনার স্ক্রিপ্টটি /bin/bash
পরিবর্তে চালিত হয়েছে তা নিশ্চিত করতে হবে /bin/sh
। অথবা, যদি আপনি আত্মবিশ্বাসী, সাহসী - এবং সম্ভবত নির্বোধ - এটি বর্তমানে যে কোনও শেলের সাথে লিঙ্কযুক্ত /bin/sh
বা এর অনুলিপি /bin/bash
পরিবর্তে একটি লিঙ্ক বা অনুলিপি হিসাবে পরিবর্তন করুন। আপনি যদি তা নিশ্চিত যে /bin/sh
হয় bash
, তাহলে আপনি আচরণ যা ব্যবহার করছেন bash
যখন হিসাবে চালানো দেখাবে না তা /bin/sh
; bash
হিসাবে ব্যবহার করুন bash
।
/bin/sh
নাset -o pipefail
। এটি আসলেbash
ছদ্মবেশে রয়েছে, না এটি অন্যরকম শেল? যখনbash
হিসাবে চালানো হয়/bin/sh
, এটি গ্রহণ করেset -o pipefail
?