সাব-শেল ছাড়াই ব্যাশ-এ কোনও কমান্ডের আউটপুটকে কেন্দ্র করে


9

আমি সাব-শেল তৈরি না করে বা অস্থায়ী ফাইল ব্যবহার না করে কমান্ডের আউটপুটটি লুপ করতে চাই।

আমার স্ক্রিপ্টের প্রাথমিক সংস্করণটি দেখতে দেখতে এগুলি কার্যকর হয়েছিল, তবে এটি কাজ করে না কারণ এটি সাবসেল তৈরি করে এবং exitকমান্ডটি মূল স্ক্রিপ্টের পরিবর্তে সাবশেলটি বন্ধ করে দেয় যা প্রয়োজনীয়। পলিসি রাউটিংটি কনফিগার করার জন্য এটি একটি বৃহত্তর স্ক্রিপ্টের অংশ, এবং যদি এটি এমন কোনও শর্ত সনাক্ত করে যা রাউটিংকে ব্যর্থ করে দেবে it

sysctl -a 2>/dev/null | grep '\.rp_filter' | while read -r -a RPSTAT ; do

  if [[ "0" != "${RPSTAT[2]}" ]] ; then
    echo >&2 "RP Filter must be disabled on all interfaces!"
    echo >&2 "The RP filter feature is incompatible with policy routing"
    exit 1
  fi
done

সুতরাং প্রস্তাবিত বিকল্পগুলির মধ্যে একটি হ'ল সাব-শেল এড়াতে এই জাতীয় কমান্ড ব্যবহার করা।

while read BLAH ; do echo $BLAH; done </root/regularfile

সুতরাং এটি আমার কাছে মনে হয় যে আমি সাবস্কেলটি এড়াতে এবং এখনও আমার পছন্দসই প্রোগ্রামটি থেকে আউটপুট পেতে এ জাতীয় কমান্ড ব্যবহার করা উচিত।

while read BLAH ; do echo $BLAH; done <(sysctl -a 2>/dev/null | grep '\.rp_filter')

দুর্ভাগ্যক্রমে, এই আদেশটি ব্যবহার করার ফলে এই ত্রুটি হয়।

-bash: syntax error near unexpected token `<(sysct ...

আমি সত্যিই বিভ্রান্ত হয়ে পড়েছি কারণ এটি কাজ করে।

cat <(sysctl -a 2>/dev/null | grep '\.rp_filter')

আমি এই কমান্ডের আউটপুটটিকে একটি অস্থায়ী ফাইলে সংরক্ষণ করতে পারি এবং অস্থায়ী ফাইলটিতে পুনঃনির্দেশ ব্যবহার করতে পারি, তবে আমি তা করা এড়াতে চেয়েছিলাম।

তাহলে পুনঃনির্দেশ কেন আমাকে ত্রুটি দিচ্ছে এবং অস্থায়ী ফাইল তৈরি করার পরে আমার কাছে অন্য কোনও বিকল্প আছে কি?


উত্তর:


13

আপনি একটি মিস <। হতে হবে:

while read BLAH ; do echo $BLAH; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter')

<(sysctl -a 2>/dev/null | grep '\.rp_filter')ফাইল হওয়ার কথা ভাবুন ।


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

2
গুগল "প্রক্রিয়া বিকল্প"। যেমন tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB
dogbane

এটি লক্ষ করা উচিত যে <() প্রতিস্থাপন ফাইল বর্ণনাকারী ব্যবহার করে এবং কিছু অপারেটিং সিস্টেমে স্বচ্ছভাবে অস্থায়ী ফাইলগুলি তৈরি এবং ব্যবহার করবে।
ewindisch

@ জোরেদাছে: কেবলমাত্র <(ব্যাশ ম্যানুয়ালটিতে অনুসন্ধান করুন (এটি "প্রক্রিয়া বিকল্পের অধীনে")।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ উইন্ডিশ, যদি কোনও সরঞ্জাম স্বচ্ছভাবে একটি টেম্পাইল তৈরি করে যা জরিমানা হয় তবে আমি নিজেই একটি তৈরি করতে চাইনি, যখন আমার নিশ্চিত ছিল যে আমার দরকার নেই।
জোরদাচে

0

আরও কিছু বিকল্পের জন্য যদি কেউ আবার এখানে আসে ...

শেল উপর নির্ভর করে, আপনি সম্ভবত ব্যবহার করতে পারে set -o errexitযখন (ক subshell সহ) কমান্ড একটি আটকে হচ্ছে না প্রস্থান করে নন-জিরো পিতা বা মাতা শেল প্রস্থান আছে ifঅবরোধ করা বা একটি trailing &&বা ||, হিসাবে

/bin/false || echo "ignoring error"

বা, আপনার কাছে পিতামাতার কিল এবং ll পিপিআইডি এনভায়রনমেন্ট ভেরিয়েবল ব্যবহারের জন্য সাব-শেল সিগন্যাল থাকতে পারে if

অথবা আপনি যখন ব্লকটি একটি ফাংশনে স্থানান্তরিত করতে পারেন এবং 0/1 (স্পষ্টত ব্লক করার পরে 0 ফিরে আসবেন) এবং কেবল আপনার পাইপলাইনটি পছন্দ করতে পারেন sysctl | grep | function || exit। আমি মনে করি আপনিও ইনলাইন ব্লকে রিটার্ন রাখতে পারলেন, তবে ফাংশনগুলি আপনার বন্ধু। ;)

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