جایگزینی فرآیند
در حالی که آنها شبیه به هم هستند و هر دو می توانند برای ترکیب جریان ها برای تغییر مسیر استفاده شوند، تفاوت مهمی بین دستورات گروه و پوسته های فرعی وجود دارد. در حالی که یک دستور گروهی تمام دستورات خود را در پوسته فعلی اجرا میکند، یک پوسته فرعی (همانطور که از نامش پیداست) دستورات خود را در یک کپی فرزند از پوسته فعلی اجرا میکند. این بدان معنی است که محیط کپی شده و به نمونه جدیدی از پوسته داده می شود. هنگامی که زیر پوسته خارج می شود، کپی محیط از بین می رود، بنابراین هر تغییری که در محیط زیرشل ایجاد شود (از جمله تخصیص متغیر) نیز از بین می رود. بنابراین، در بیشتر موارد، مگر اینکه یک اسکریپت به زیر پوسته نیاز داشته باشد، دستورات گروهی به پوستههای فرعی ارجحیت دارند. دستورات گروهی هم سریعتر هستند و هم به حافظه کمتری نیاز دارند.
ما نمونه ای از مشکل محیط زیر پوسته را در فصل 28 دیدیم، زمانی که کشف کردیم که یک خواندن دستور در خط لوله آنطور که ما به طور شهودی انتظار داریم کار نمی کند. به طور خلاصه، اگر خط لوله ای مانند زیر بسازیم:
پژواک "فو" | اکو $REPLY را بخوانید
پژواک "فو" | اکو $REPLY را بخوانید
محتوای پاسخ متغیر همیشه خالی است زیرا خواندن دستور در زیر پوسته اجرا می شود و کپی آن پاسخ هنگامی که پوسته فرعی خاتمه می یابد از بین می رود.
از آنجایی که دستورات در خطوط لوله همیشه در زیر پوسته ها اجرا می شوند، هر دستوری که متغیرها را مشخص کند با این مشکل مواجه می شود. خوشبختانه، پوسته یک شکل عجیب و غریب از انبساط به نام جایگزینی فرآیند که می تواند برای حل این مشکل استفاده شود.
جایگزینی فرآیند به دو صورت بیان می شود: برای فرآیندهایی که خروجی استاندارد تولید می کنند:
<(فهرست)
یا برای فرآیندهایی که ورودی استاندارد را دریافت می کنند:
>(فهرست)
جایی که فهرست لیستی از دستورات است.
برای حل مشکل ما با خواندن، می توانیم جایگزینی فرآیند را به صورت زیر به کار ببریم:
خواندن < <(echo "foo") echo $REPLY
خواندن < <(echo "foo") echo $REPLY
جایگزینی فرآیند به ما اجازه می دهد تا خروجی یک پوسته فرعی را به عنوان یک فایل معمولی برای اهداف تغییر مسیر در نظر بگیریم. در واقع، از آنجایی که نوعی بسط است، میتوانیم ارزش واقعی آن را بررسی کنیم:
[me@linuxbox ~]$ echo <(echo "foo")
/dev/fd/63
[me@linuxbox ~]$ echo <(echo "foo")
/dev/fd/63
با استفاده از از دست برای مشاهده نتیجه بسط، می بینیم که خروجی زیر پوسته توسط فایلی به نام ارائه می شود. /dev/fd/63.
جایگزینی فرآیند اغلب با حلقه های حاوی استفاده می شود خواندن. در اینجا یک مثال از a است
حلقه خواندن که محتویات فهرست دایرکتوری ایجاد شده توسط پوسته فرعی را پردازش می کند:
#! / bin / bash
# pro-sub: نسخه ی نمایشی جایگزینی فرآیند
در حالی که خواندن attr لینک مالک گروه اندازه تاریخ زمان نام فایل. انجام گربه <<- EOF
نام فایل: $filename اندازه: $size
مالک: $owner
گروه: $group اصلاح شده: $date $time پیوندها: $links ویژگی ها: $attr
EOF
انجام شد <(ls -l | tail -n +2)
#! / bin / bash
# pro-sub: نسخه ی نمایشی جایگزینی فرآیند
در حالی که خواندن attr لینک مالک گروه اندازه تاریخ زمان نام فایل. انجام گربه <<- EOF
نام فایل: $filename اندازه: $size
مالک: $owner
گروه: $group اصلاح شده: $date $time پیوندها: $links ویژگی ها: $attr
EOF
انجام شد <(ls -l | tail -n +2)
حلقه اجرا می شود خواندن برای هر خط از فهرست دایرکتوری خود فهرست در خط پایانی فیلمنامه تولید می شود. این خط خروجی جایگزینی فرآیند را به ورودی استاندارد حلقه هدایت می کند. در دم دستور در خط لوله جایگزینی فرآیند گنجانده شده است تا خط اول فهرست را حذف کند که نیازی به آن نیست.
هنگام اجرا، اسکریپت خروجی مانند زیر تولید می کند:
[me@linuxbox ~]$ طرفدار فرعی | head -n 20
نام فایل: addresses.ldif حجم: 14540
صاحب: من
گروه: من
Modified: 2009-04-02 11:12
[me@linuxbox ~]$ طرفدار فرعی | head -n 20
نام فایل: addresses.ldif حجم: 14540
صاحب: من
گروه: من
Modified: 2009-04-02 11:12
لینک ها:
1
لینک ها:
ویژگی ها: -rw-r--r--
نام فایل: bin
حجم: 4096
صاحب: من
گروه: من
Modified: 2009-07-10 07:31
لینک ها: 2
ویژگی ها: drwxr-xr-x
نام فایل: bookmarks.html حجم: 394213
صاحب: من
گروه: من
ویژگی ها: -rw-r--r--
نام فایل: bin
حجم: 4096
صاحب: من
گروه: من
Modified: 2009-07-10 07:31
لینک ها: 2
ویژگی ها: drwxr-xr-x
نام فایل: bookmarks.html حجم: 394213
صاحب: من
گروه: من