میتوانید از گزینه -c پوسته برای اجرای شل جهت اجرای تکه کوتاهی از اسکریپت استفاده کنید:
sh -c 'echo "Hi! This is a short script."'
این کار بدون وسیلهای برای عبور دادن دادهها به آن، روش قشنگ معمولاً بلااستفادهای است. بهترین راه برای عبور دادن خُردهای از دادهها به پوسته شما، ارائه آنها به عنوان پارامترهای مکانی است:
sh -c 'echo "Hi! This short script was run with the arguments: $@"' -- "foo" "bar"
به -- قبل از پارامترهای مکانی واقعی، توجه کنید. اولین شناسهای که به پردازش شل میدهید(که شناسهای برای گزینه -c نیست) در متغیر $0 قرار داده میشود. پارامترهای مکانی از $1 شروع میشوند، بنابراین ما یک placeholder کوچک در $0 قرار میدهیم. این هر چیزی که شما مایل باشید میتواند باشد، در مثال، ما -- عمومی را به کار بردهایم.
این شیوه غالباً در اسکریپتنویسی پوسته، موقعی به کار میرود که میخواهید یک برنامه خطفرمانی غیر پوستهای برخی کُدهای bash را اجرا کند، مثلاً با find(1):
find /foo -name '*.bar' -exec bash -c 'mv "$1" "${1%.bar}.jpg"' -- {} \;
در اینجا از find درخواست میکنیم فرمان bash را برای هر فایل *.bar که پیدا میکند، به عنوان اولین پارامتر مکانی پردازش bash اجرا نماید. پردازش bash پس از انجام بسط پارامتر روی پارامتر مکانی اول، دستور mv را به منظور تغییر نام فایلهای با پسوند bar به فایلهای با پسوند jpg اجرا میکند.
به طور جایگزین، اگر برنامه غیرپوستهای شما امکان تنظیم متغیرهای محیط را برای شما فراهم میکند، میتوانید این کار را انجام بدهید و سپس با استفاده از متغیرهای معمولی همان نام آنها را بخوانید.
به طور مشابه، فرض کنید برنامهای(مثلاً مدیریت فایل) به شما اجازه میدهد یک فرمان خارجی تعریف کنید که یک شناسه به آن ضمیمه خواهد شد، اما شما آن شناسه را جایی در وسط لازم دارید. در آن حالت:
#!/bin/sh sh -c 'command foo "$1" bar' -- "$@"
پرسش و پاسخ 12 (آخرین ویرایش 2011-04-12 20:01:42 توسط Lhunath)