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


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.