منبع اصلی نوشتار زیر در این لینک قرار دارد

فایل‌های الگو


فایلهای قالب پوسته

پرسش‌های بسیاری در باره چگونگی استفاده ار یک فایل الگو دریافت نموده‌ایم، این به معنای یک فایل با placeholder(جای نگهدارنده)هایی در آن است، که می‌خواهیم در زمان اجرا با کمیت‌ها جایگزین نماییم. چند شکل متفاوت از این پرسش وجود دارد، و به طوریکه انتظار دارید، چند پاسخ متفاوت بر اساس نیازمندی‌های واقعی.

اساسی‌ترین نیاز آن است که autoconf گنو به کار می‌برد: یک فایل الگوی پیش‌ساخته با مواردی %PLACEHOLDER% در آن، و کمیت‌هایی در متغیرهای ویژه پوسته که می‌خواهیم استفاده کنیم. بر این وظیفه بخصوص، sed بسیار خوب منطبق می‌شود:

 sed -e "s/%PLACEHOLDER%/$variable/g" \
     -e "s/%FIRSTNAME%/$firstname/g" \
     ... "$templatefile" > "$outputfile"

نشانه‌گذاری %FOO% همان است که autoconf عملاً برای placeholderهایش استفاده می‌کند، انتخابش به این جهت است. اگر متغیرها بتوانند شامل کاراکترهای / یا سطر جدید در محتوایشان باشند، آنوقت گام‌های متناسب باید برداشته شود -- یک جدا کننده غیر از / می‌تواند برای فرمان ‎sed s///‎ استفاده بشود، اما برای سطر جدید به شما توصیه می‌شود یک پرسش و پاسخ متداول پیشرفته sed را کنکاش نمایید. خوشبختانه، وضعیتی که افراد بخواهند سطرهای جدید را به جایگزینی‌هایشان ضمیمه کنند، در این شکل از پرسش، تا اندازه‌ای غیر معمول است.

یک شکلِ جایگزین این پرسش عبارت است از، «من یک فایل با بسط پارامترهای پوسته در آن دارم، مانند ‎$foo‎. من از قبل نمی‌دانم کدام متغیرها استفاده خواهند شد، بنابراین نمی‌توانم دقیقاً یک لیست از تمام آنها دریک فرمان تنومند sed بسازم.» (در اینجا سطرهای جدید داخل متغیرها خیلی بیشتر معمول هستند، اما خوشبختانه آنها مشکلی در راه حلی که ارایه می‌دهیم نشان نمی‌دهند.)

این مشکل می‌تواند به وسیله ساختن یک HereDocument و تغذیه نتیجه به یک پوسته برای بسط یافتن، حل بشود:

 { echo "cat <<EOF"
   cat "$templatefile"
   echo "EOF"
 } | sh > "$outputfile"

توجه: اگر یک نتیجه غیرمنتظره که شامل EOF در انتهای خروجی است، به دست می‌آورید، احتمالاً فایل الگوی شما فاقد کاراکتر سطرجدید در انتها می‌باشد.

به خاطر بیاورید تا زمانی که رشته نگهبان (در موقعیت ما EOF) در سطر اول نقل‌قولی نشده باشد در بدنه یک HereDocument جایگزینی‌ها انجام می‌شوند. ما در اینجا از این مطلب بهره‌گیری می‌کنیم.

همچنین، توجه نمایید که جایگزینی در یک پوسته جدید sh (یا bash یا ksh، هر چه که شما لازم دارید) انجام می‌شود، نه در پوسته جاری. بنابراین، هر متغیری که شما می‌خواهید استفاده کنید باید export شده باشد.

چون هر جایگزینی فرمان در فایل الگو به عنوان کُد پوسته اجرا خواهد شد، اهمیت دارد که هر فایل الگویی که به این طریق استفاده می‌شود تحت کنترل شما باشد، و توسط یک کاربر تولید نشده باشد. به شما هشدار داده می‌شود.


CategoryShell

فایلهای الگو (آخرین ویرایش ‎2010-08-26 15:12:58‎ توسط cei-gla-cpk2)