বাশ: কমান্ডের আউটপুট থেকে কীভাবে একবারে একটি লাইন পড়তে হয়?


49

আমি ক ব্যবহার করে একটি কমান্ডের আউটপুট পড়তে চেষ্টা করছি while loop

while read -r line
do
    echo "$line"
done <<< $(find . -type f)

আউটপুট আমি পেয়েছি

ranveer@ranveer:~/tmp$ bash test.sh
./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello
ranveer@ranveer:~/tmp$ 

এর পরে আমি চেষ্টা করেছি

$(find . -type f) | 
while read -r line
do
    echo "$line"
done 

তবে এটি একটি ত্রুটি তৈরি করেছে test.sh: line 5: ./test.py: Permission denied

সুতরাং, আমি কীভাবে এটি লাইন দিয়ে পঠন করব কারণ আমার মনে হয় বর্তমানে এটি সম্পূর্ণ লাইনটি একবারে স্লਪਰিং করছে।

প্রয়োজনীয় আউটপুট:

./test.py
./test1.py
./out1
./test.sh
./out
./out2
./hello

3
আমি বাশ এফএকিউ 01 পড়ার পরামর্শ দিচ্ছি - ফাঁদগুলি এড়াতে প্রচুর দরকারী তথ্য এবং পরামর্শ।
jw013

জন্য while readঅংশ, দেখতে IFS বুঝুন এবং প্রশ্ন সেখানে লিঙ্ক।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


54

একটি ভুল আছে, আপনার দরকার < <(command)নেই<<<$(command)

< <( )একটি প্রক্রিয়া বিকল্প , $()একটি কমান্ড প্রতিস্থাপন এবং এখানে<<< একটি স্ট্রিং


2
@ র্যানআরগ $( )সবকিছু বন্ধ করার চেষ্টা বন্ধ করুন ! এটি কমান্ড প্রতিস্থাপনের জন্য সিনট্যাক্স , যা কমান্ড আউটপুট ব্যবহার করার একমাত্র উপায়। পাইপ এবং প্রক্রিয়া প্রতিস্থাপন এবং এখানে স্ট্রিং অন্যদের হয় এবং এগুলির সবকটির প্রাকৃতিকভাবে পৃথক বাক্য গঠন থাকে। আপনি কী করছেন তা যদি আপনি সত্যিই না জেনে থাকেন তবে আপনার ফাইলের নামগুলি পার্সিং করা উচিত নয়।
jw013

ধন্যবাদ এটি কাজ সম্পর্কে আরও পড়তে হবে Process Substitution
রানার্যাগ

@ jw013: আমি বাশ শিখর। ভবিষ্যতে আপনার পরামর্শটি আমার মনে রাখবে।
রানার্যাগ

13

দ্রষ্টব্য যে ফাইলের নামগুলি নতুন লাইনের অক্ষরগুলি অন্তর্ভুক্ত করা থেকে বিরত রয়েছে। প্রতিটি ফাইলের জন্য একটি কমান্ড চালানোর জন্য ক্যানোনিকাল পথ পাওয়া খোঁজ করা।

find . -type f -exec cmd {} \;

এবং আপনি যদি বাশে জিনিসগুলি করতে চান তবে:

find . -type f -exec bash -c '
  for file do
    something with "$file"
  done' bash {} +

এছাড়াও, স্ক্রিপ্টগুলিতে "পঠন" কমান্ড কল করার প্রচলিত উপায় (যদি আপনি এটি ইনপুটটিতে অতিরিক্ত প্রসেসিং করতে না চান) হ'ল:

IFS= read -r var

-rreadব্যাকস্ল্যাশ অক্ষরগুলির বিশেষত চিকিত্সা করা থেকে বিরত রাখা (পৃথককারী এবং নতুন লাইনের জন্য একটি পলায়ন চরিত্র হিসাবে), এবং আইএফএস = এর জন্য ফাঁকা স্ট্রিংয়ের ক্ষেত্রে পৃথককারীদের তালিকা নির্ধারণ করা read(অন্যথায় যদি কোনও শ্বেত স্পেসের অক্ষর সেই তালিকায় থাকে তবে সেগুলি এগুলি থেকে ছিনিয়ে নেওয়া হবে) ইনপুটটির শুরু এবং শেষ)।

শেলগুলিতে লুপ ব্যবহার করা সাধারণত একটি খারাপ ধারণা (আপনি শেলগুলিতে কীভাবে কাজ করছেন তা নয় যেখানে আপনি একাধিক সরঞ্জাম ক্রমান্বয়ে এক বা একাধিক সরঞ্জাম চালানোর পরিবর্তে কোনও কাজে সম্মিলিতভাবে এবং একযোগে কাজ করেন না)।

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