আমি চাই যখনই আমার শেল স্ক্রিপ্টগুলি ব্যর্থ হয় যখনই তাদের সাথে চালিত কোনও আদেশ ব্যর্থ হয়।
সাধারণত আমি এটি দিয়ে:
set -e
set -o pipefail
(সাধারণত আমিও যোগ করি set -u
)
বিষয়টি হ'ল উপরের কোনওটি প্রক্রিয়া বিকল্পের সাথে কাজ করে না। এই কোডটি "ঠিক আছে" প্রিন্ট করে এবং রিটার্ন কোড = 0 দিয়ে প্রস্থান করে, যখন আমি এটি ব্যর্থ হতে চাই:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
"পাইপফেইল" সমতুল্য কিছু আছে তবে প্রক্রিয়া প্রতিস্থাপনের জন্য? কমান্ডের কাছে যাওয়ার অন্য কোনও উপায় হ'ল কমান্ডের আউটপুট যেমন ফাইল হিসাবে থাকে তবে যখনই কোনও প্রোগ্রাম ব্যর্থ হয় তখন ত্রুটি বাড়াতে পারে?
একজন দরিদ্র লোকের সমাধান সনাক্ত করতে হবে যে যদি এই কমান্ডগুলি স্ট্ডারকে লিখিত হয় (তবে কিছু কমান্ডগুলি স্ট্যান্ডারকে সুসংগঠিত পরিস্থিতিতে লিখিত হয়)।
আরও একটি পিক্সিকস কমপ্লায়েন্ট সলিউশন নামযুক্ত পাইপ ব্যবহার করা হবে, তবে সংকলিত কোড থেকে ফ্লাইয়ের উপর নির্মিত অনেলাইনার হিসাবে আমার এই কমান্ডগুলি-যে-ব্যবহার-প্রক্রিয়া-প্রতিস্থাপনের প্রয়োজন হবে, এবং নামযুক্ত পাইপ তৈরি করা জিনিসগুলিকে জটিল করে তুলবে (অতিরিক্ত কমান্ড, ট্র্যাপিং ত্রুটির জন্য ট্র্যাপিং এগুলি মুছে ফেলা ইত্যাদি)
$$
প্রতিস্থাপনটি আমার পক্ষে কাজ করে না, যেহেতু কমান্ড প্রতিস্থাপন প্রক্রিয়া ব্যবহার করে এমন কমান্ড হিসাবে করা হয় না যা একটি "নন শেল" কোড (পাইথন) থেকে তৈরি কমান্ড পাইপলাইনের ভিতরে করা হয় process সম্ভবত আমার অজগরে সাবপ্রসেস তৈরি করা উচিত এবং সেগুলি প্রগ্রেটিকভাবে পাইপ করা উচিত।
kill -2 0
।
mkfifo pipe; { rm pipe; cat <file; } >pipe
। যে কমান্ড স্তব্ধ করা পর্যন্ত একটি পাঠক প্রর্দশিতpipe
কারণ এটি শেল যা নেইopen()
তাই যত তাড়াতাড়ি উপর একটি পাঠক আছে যেমনpipe
FS জন্য লিঙ্কpipe
হয়rm
; 'd এবং তারপরcat
কপি যে নল জন্য শেল এর বর্ণনাকারী আউট infile। এবং যাইহোক, আপনি যদি কোনও প্রক্রিয়া সাব এর বাইরে একটি ত্রুটি প্রচার করতে চান: <( ! : || kill -2 "$$")