ESH(1)   ESH(1)

esh - سیستم قالب‌ساز ساده مبتنی بر شل

esh [-d] [-o output] [-s shell] [--] file [variable ...]

esh <-h | -V>

دستور esh (شل توکار / embedded shell) یک موتور قالب‌ساز برای ارزیابی دستورات شل قرارگرفته در قالب‌های دلخواه است. این ابزار شبیه به ERB (Embedded RuBy) برای شل عمل می‌کند و هدف آن قالب‌سازی برای فایل‌های پیکربندی است. برخلاف ERB، این ابزار امکان گنجاندن (include) یک قالب ESH درون قالبی دیگر را فراهم می‌آورد (از نسخه 0.2.0 به بعد).

دستور esh فایل قالب (file)، یا در صورت مشخص شدن “-”، ورودی استاندارد (stdin) را به دنباله‌ای از دستورات شل تبدیل می‌کند. دستورات میان برچسب‌های <% و %> بدون تغییر منتقل می‌شوند، و سایر بخش‌ها اسکیپ شده و پیشوند دستور printf به آن‌ها افزوده می‌شود. این دستورات در نهایت با استفاده از shell ارزیابی و اجرا می‌شوند (مگر اینکه گزینه -d مشخص شده باشد).

-d

قالب را ارزیابی و اجرا نکن، فقط اسکریپت شل تولیدشده را در خروجی بریز.

-o file

فایل خروجی یا “-” برای خروجی استاندارد (STDOUT). پیش‌فرض برابر با “-” است.

-s shell

نام دستور یا مسیر شل مورد استفاده برای ارزیابی و اجرای قالب. نباید شامل فاصله (space) باشد. پیش‌فرض برابر با “/bin/sh” است.

-h

نمایش پیام راهنما و خروج.

-V

چاپ اطلاعات نسخه و خروج.

دستور esh می‌تواند با استفاده از متغیرهای محیطی زیر پیکربندی شود:

ESH_AWK

نام دستور یا مسیر برنامه awk مورد استفاده. نباید شامل فاصله باشد. پیش‌فرض برابر با “awk” است.

ESH_MAX_DEPTH

حداکثر عمق گنجاندن (include). پیش‌فرض برابر با 3 است.

ESH_SHELL

مشابه گزینه -s shell است.

متغیرهای محیطی اضافی زیر درون قالب و برای فرایندهای ایجادشده توسط esh در دسترس هستند:

ESH

مسیر مفسر esh.

دستور esh با وضعیت خروج shell یا awk خاتمه می‌یابد، مگر آنکه پیش از تبدیل قالب خطایی رخ داده باشد.

•0 - خروج موفقیت‌آمیز، هیچ خطایی رخ نداده است.
•1 - خطای عمومی.
•10 - استفاده نادرست یا آرگومان‌های نامعتبر.
•11 - خطای نحوی ESH.
•12 - خطای گنجاندن (include): فایل پیدا نشد.
•13 - خطای گنجاندن: فراتر رفتن از حداکثر عمق مجاز (ESH_MAX_DEPTH).

ابزار ESH دارای دو برچسب برای کدهای شل، یک برچسب برای گنجاندن (include)، برچسب توضیحات (کامنت) و روشی برای اسکیپ کردن جداکننده‌های برچسب است.

<% commands %>

دستورات (commands) را اجرا کرده و این برچسب را با خروجی استاندارد (stdout) آن جایگزین می‌کند.

<%= values %>

دستور printf '%s ' را با مقادیر (values) به عنوان آرگومان اجرا می‌کند و این برچسب را با خروجی حاصل (بدون فاصله‌های انتهایی) جایگزین می‌نماید. مقادیر در کوتیشن قرار نمی‌گیرند و اسکیپ نمی‌شوند، بنابراین تمام جایگزینی‌های شل روی آن‌ها اعمال خواهد شد.

<%+ filename %>

قالب ESH را از نام فایل مشخص‌شده (filename) خوانده، تبدیل کرده و به جای این برچسب قرار می‌دهد. عملیات گنجاندن (include) به صورت بازگشتی پردازش می‌شود، اما عمق آن به مقدار ESH_MAX_DEPTH محدود است.

اگر filename یک مسیر نسبی باشد، بر اساس دایرکتوری فایل قالبی که این برچسب در آن قرار دارد ارزیابی و حل می‌شود. اگر قالب از ورودی استاندارد (stdin) خوانده شود، گنجاندن‌های سطح اول نسبت به دایرکتوری کاری فعلی ارزیابی می‌شوند. لطفاً توجه داشته باشید که عملیات گنجاندن در طول مرحله تبدیل پردازش می‌شود، نه در مرحله ارزیابی و اجرا؛ بنابراین filename نمی‌تواند یک عبارت یا متغیر باشد!

برخلاف سایر موارد، این برچسب باید در همان خط بسته شود، در غیر این صورت خطای نحوی رخ می‌دهد.

<%# comment %>

از خروجی نهایی حذف می‌شود.

-%>

می‌تواند به جای %> استفاده شود. اگر در انتهای خط به کار رود، شکست خط (انتقال به خط بعد) پس از خود را حذف می‌کند، در غیر این صورت هیچ تأثیری در حذف خط نخواهد داشت.

<%%

هنگامی که خارج از برچسب‌های فوق استفاده شود، کاراکترهای دقیق <% را در خروجی تولید می‌کند.

%%>

هنگامی که درون برچسب‌های فوق استفاده شود، کاراکترهای دقیق %> را در خروجی تولید می‌کند.

برچسب‌های باز و بسته ممکن است در یک خط نباشند.

متن‌های خارج از برچسب‌ها به صورت متن ساده در نظر گرفته می‌شوند، اما تحت تأثیر کدهای شل برچسب‌گذاری‌شده پیرامون خود قرار می‌گیرند. به عنوان مثال، متنی که با یک دستور شرطی برچسب‌گذاری‌شده if احاطه شده باشد، تنها در صورتی در خروجی ظاهر می‌شود که شرط درست (true) باشد.

nginx.conf.esh

http {
    access_log <%= $logs_dir/access.log %> main;
    resolver <%= $(sed -En 's/^nameserver ([^#]+)/\1/p' /etc/resolv.conf) %>;
    <% if nginx -V 2>&1 | grep -q lua-nginx-module; then -%>
    lua_package_path '<%= $(pkg-config --variable=INSTALL_LMOD lua) %>/?.lua';
    <% fi -%>
    <%+ ./http-common.esh %>
    <%# The rest of the config is omitted %>
}

برای تولید فایل پیکربندی نهایی، این دستور را اجرا کنید:

esh -o nginx.conf nginx.conf.esh logs_dir=/var/log/nginx

نویسنده esh جاکوب جیروتکا (Jakub Jirutka) است.

گزارش باگ‌ها و مشکلات را به بخش ردیابی مشکلات پروژه ارسال کنید: https://github.com/jirutka/esh/issues.

sh(1)

2024-07-05