রিডারারি (বা পাইপ) ইস্যু


19

readarrayকমান্ডের এক অদ্ভুত আচরণ নিয়ে আটকে গেলাম ।

man bashপদ বলে:

readarray
     Read lines from the standard input into the indexed array variable array

তবে এই স্ক্রিপ্টগুলি কাজ করে না (অ্যারেটি খালি):

unset arr; (echo a; echo b; echo c) | readarray arr; echo ${#arr[@]}
unset arr; cat /etc/passwd | readarray arr;  echo ${#arr[@]}

এবং এই কাজগুলি:

unset arr; readarray arr < /etc/passwd ;  echo ${#arr[@]}
unset arr; mkfifo /tmp/fifo; (echo a; echo b; echo c) > /tmp/fifo & mapfile arr < /tmp/fifo ; echo ${#arr[@]}

পাইপ দিয়ে কী ভুল?

উত্তর:


15

হয়তো চেষ্টা করুন:

unset arr
printf %s\\n a b c | {
    readarray arr
    echo ${#arr[@]}
}

আমি আশা করি এটি কার্যকর হবে তবে আপনি যখন পাইপলাইনটির শেষে এই শেষ {শেল ; }প্রসঙ্গটি থেকে বেরিয়ে আসবেন তখনই আপনি |আপনার পরিবর্তনশীল মানটি হারাবেন। এটি কারণ পাইপলাইনের মধ্যে |পৃথক প্রতিটি |প্রক্রিয়া |একটি (সাব-শেলের মধ্যে কার্যকর করা হয় )। সুতরাং আপনার জিনিস একই কারণে কাজ করে না:

( arr=( a b c ) ) ; echo ${arr[@]}

... না - ভেরিয়েবল মানটি আপনি যেটিতে কল করেছেন তার চেয়ে আলাদা শেল প্রক্রিয়াতে সেট করা হয়েছিল ।


23

readarrayবর্তমান শেলটিতে কমান্ড কার্যকর হয়েছে তা নিশ্চিত করতে , হয় পাইপলাইনের জায়গায় প্রক্রিয়া বিকল্প ব্যবহার করুন:

readarray arr < <( echo a; echo b; echo c )

অথবা (যদি bash৪.২ বা তারপরে) lastpipeশেল বিকল্পটি ব্যবহার করুন :

shopt -s lastpipe
( echo a; echo b; echo c ) | readarray arr

1
কুল। এটি কাজ করে, তবে প্রক্রিয়া প্রতিস্থাপনটি আসলে কী? এবং < <2 টি তীর থাকার অর্থ কী ?
— সিএমসিডিগ্রাগনকাই

1
দেখুন bashমানুষ পাতা। সংক্ষেপে, এটি একটি ফাইল বর্ণনাকারী হিসাবে পাইপলাইন চিকিত্সার জন্য সিনট্যাক্স। < <(...)এর অর্থ হ'ল <অভ্যন্তরের কমান্ডের আউটপুট থেকে ইনপুট (প্রথম ) পুনর্নির্দেশ করা <(...)। সিমিলারি, > >(...)ভিতরে পাইপলাইনের স্ট্যান্ডার্ড ইনপুটটিতে স্ট্যান্ডার্ড আউটপুট দেয় >(...)। প্রক্রিয়া প্রতিস্থাপনের সাথে আপনাকে পুনঃনির্দেশ ব্যবহার করার প্রয়োজন নেই। cat <( echo a b c )পাশাপাশি কাজ করে।
— চিপনার

এই উভয় বিকল্পই আমার জন্য একটি অনাকাঙ্ক্ষিত ফলাফল উত্পন্ন করে, যেখানে প্রতিটি অ্যারে আইটেম প্রতিটি স্ট্রিংয়ের শেষে লাইন শেষ বজায় রাখে। যদিও smac89 দ্বারা উত্তরটিতে এই সমস্যা নেই।
— Thnee

3

readarray স্টিডিনের কাছ থেকেও পড়তে পারেন, তাই:

readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.