انتقال خروجی یک دستور خط به خط به دستور دیگه
توسط: vahit
خب عنوان پست توضیح جامعی بود برای خودش و به نظر میاد فقط کافیه من اینجا جواب رو بگم ولی چون قرار هست اطلاعات تکمیلی در مورد راهحل رو خودتون پیدا کنید پس من مشکل و مسئله رو یه خورده کاملتر توضیح میدم تا متوجه منظورم بشید :)
فرض کنید دستوری داریم که لازم هست با استفاده از حلقهای مانند حقلهی while خروجی اون رو خط به خط پردازش کنیم. خب اوّلین راهحلی که به ذهن میرسه استفاده از پایپ (pipe (|)) هست. به شکل زیر:
1 2 3 |
ls -1 | while read -r line; do echo $line done |
خب این درست هست و کار میکنه ولی بعضی مواقع تعداد دستوراتی که قبل از حلقهی while باید انجام بگیرند به نحو و حدی میرسه که bash نمیتونه تشخیص بده خط کجا تموم شده و همهی خروجی رو به عنوان یک خط در نظر میگیره و به حلقه ارسال میکنه که خب باعث میشه ما خروجی دلخواهمون از حلقه رو نگیریم.
برای رفع این مشکل از راهحل دیگه ای استفاده میکنیم که به این روش Process Substitution گفته میشه. اینکه دقیقاً چی هست و به چه کارهایی میاید الان از حوصلهی من و این پست خارج هست ولی شکل کلیش به این صورت هست:
1 2 3 4 5 6 |
whiel read -r line; do loop internal commands . . . done < <(intended command) |
حلقهی while با آرگومانهای read -r line شروع میشه و داخلش دستورات مورد نظر رو داره ولی در قسمت intended command دستوری که خروجی اون باید وارد حلقه بشه رو وارد میکنیم. برای مثال همون دستور ls -1! در این حالت این دستور اجرا شده و خطوط خروجی اون یکی یکی وارد حلقه میشن تا دستورات داخلی حلقه بر روی اونها اعمال بشه. نکتهای که در این شکل خیلی مهم هست اینه که بین کاراکترهای > یک فاصلهای وجود داشته باشه یعنی در حقیقت همین فاصله هست که باعث میشه شکل کلی دستور به process substitution تبدیل بشه!
برای اطلاعات بیشتر در مورد Process Substitution میتونید به لینکهای زیر مراجعه کنید:
- http://mywiki.wooledge.org/ProcessSubstitution
- http://unix.stackexchange.com/questions/52026/bash-how-to-read-one-line-at-a-time-from-output-of-a-command#52027
- http://mywiki.wooledge.org/BashFAQ/106