آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

bashism


چگونه اسکریپت‌های bash بسازیم که در dash کار کنند

این صفحه کوششی است برای لیست کردن برخی از رایج‌ترین bashismها، یعنی ویژگی‌هایی که توسط POSIX تعریف نشده‌اند (در dash، یا ‎/bin/sh‎ متداول، کار نخواهند کرد). احتمالاً شامل تمام جزئیات نخواهد بود. همچنین توجه نمایید که ما در باره "bashism" صحبت می‌کنیم، زیرا این ویکی به طور عمده متمرکز بر bash می‌باشد، اما چون اکثر ویژگی‌های اسکریپت‌نویسی Bash از ksh مشتق گردیده است تعدادی(تقریباً همه) از این ملحقات احتمالاً با تفاوت‌هایی در جزئیات، حداقل در برخی پوسته‌های دیگر مانند ksh یا zsh نیز کار می‌کنند. POSIX تعداد بسیار کمتری از آنها را لازم دانسته است.

ادامه مطلب

CompilingBad


چرا ترجمه کردن (compiling) یک اسکریپت نامناسب است

یا، چرا موقعی که شما در مورد یک مترجم اسکریپت پرسش می‌کنید greycat بر سر شما فریاد می‌کشد

اسکریپت پوسته را ملاحظه کنید. خصوصیات آن چیست؟ توانایی‌ها و ضعف‌هایش کدام هستند؟

نقاط قوت:

  • ساده، به آسانی قابل فهم
  • قابل نوشتن به طور سریع
  • فضای زیادی از دیسک اشغال نمی‌کند
  • اگر بدانید که چکار می‌کنید، بدون نیاز به اصلاح دارای شانس قابل قبولی برای کار کردن روی سیستم‌عامل‌های گوناگون است

ضعف‌ها:

  • اجرای کند (به طور نوعی)
  • عدم دسترسی معقول و قوی به حساب ممیز شناور، ساختارهای داده‌ای پیچیده، پرس و جوی بانک اطلاعاتی، و غیره (وابسته به زبان)
  • سطر ِشبانگ باید برای هر سیستم مقصد ویرایش گردد

البته، من یک اسکریپت پوسته نوشته شده به طور صحیح را در نظر می‌گیرم. بنابراین من مواردی مانند «متمایل به خطاهای دستوری و منطقی نوآموز» را به شمار نمی‌آورم، زیرا این مشخصهِ هر نوع از برنامه‌نویسی است.

دوباره به آن نقطه قوت اول که لیست کردم نگاهی بیاندازید: ساده، به آسانی قابل فهم. کدام مطلب را می‌رساند؟ بیش از هر چیز، بر این دلالت می‌کند که اشخاص می‌توانند به آن نگاه کنند!

اگر یک اسکریپت پوسته را ترجمه کنید، به یکی از این دو دلیل می‌خواهید این کار را انجام بدهید:

  1. می‌خواهید سریع‌تر اجرا شود، یا
  2. می‌خواهید آن را از مردم پنهان کنید.

اکنون، به این صفحه که در حال خواندن آن می‌باشید نگاه کنید. چیست؟ این یک انتقاد است. کجاست؟ در ویکی اشخاص است. ویکی چیست؟ ویکی یک روش آزاد توام با همکاری در ویرایش اطلاعات است. ویکی‌ها کجا زندگی می‌کنند؟ روی ‎WWW (شبکه درهم تنیده گسترده جهانی). WWW چیست؟ سیستمی برای به اشتراک نهادن آزادانه اطلاعات با کل جهان است. (لااقل، تا زمانی که قلمرو صنفی تصمیم گرفت پول در آوردن از آن را امتحان کند، چنین چیزی بود.) WWW کجا زندگی می‌کند؟ روی اینترنت. اینترنت چیست؟ یک فوق شبکه از تمام شبکه‌های کامپیوتری در جهان است که تصمیم گرفته‌اند با یکدیگر صحبت کنند. چرا چنین می‌کنند؟ به علت اینکه اشتراک اطلاعات را دوست دارند!

آگاهی نیازمند آزاد بودن است.

اشتراک گذاشتن اطلاعات همه ما را توانمند می‌سازد. توماس جفرسون1 نوشت:

  • شخصی که از من آگاهی دریافت می‌کند، آموزش خودش را بدون کاهش دادن آگاهی من به دست می‌آورد، همچنانکه آنکه شمع خود را با شمع من روشن می‌کند، روشنایی را بدون ایجاد تاریکی برای من دریافت می‌کند. به نظر می‌رسد اینکه اندیشه‌ها باید آزادانه از یکی به دیگری در سرتاسر زمین به خاطر آموزش اخلاقی و متقابل انسان و بهبود وضعیتش گسترده شوند، به طور شگفت‌انگیز و خیرخواهانه توسط طبیعت طراحی شده‌اند، طبیعت آنها را همانند آتش که بدون آن که غلظت آن در هیچ نقطه‌ای تقلیل یابد قابل گسترش در تمام فضا می‌باشد، و مانند هوایی که ما در آن نفس می‌کشیم، حرکت می‌کنیم، و به طور فیزیکی وجود داریم، و ناتوان از محدودسازی یا تصاحب انحصاری آنها هستیم، به وجود آورد.

اگر من در حال نوشتن یک سرزنش هستم، روی یک ویکی، روی WWW، روی اینترنت، آیا به راستی تصور کرده‌اید من از آن تیپ‌هایی باشم که با تلاش شما برای پنهان کردن اطلاعات همراهی خواهد کرد؟ تصور نکرده‌اید که ما به اندازه کافی بارها پرسش شما را دیده‌ایم تا بدانیم که آنچه شما سعی در انجام آن دارید کدام است؟

چرا اشخاص می‌خواهند اسکریپت‌های پوسته‌شان را پنهان کنند؟

  • آنان تلاش دارند آنها را به فروش برسانند.

  • آنها از بابت اسکریپت‌هایشان شرمسار هستند.

اگر شما از ما برای کمک به فروش یک محصول می‌پرسید، آنوقت شما یک spammer هستید و ما هیچ کاری با شما نداریم.

اگر شما از اسکریپ خودتان شرمسار هستید زیرا می‌دانید که یک گندِ مزخرف است، اما به جای اصلاح کردنش ترجیح می‌دهید آلودگی آن را از مردم پنهان کنید (ولی باز هم آنها از آن استفاده کنند!)، پس شما یک انگل برای بشریت هستید.

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


ترجمه زیان‌آور (آخرین ویرایش ‎2013-07-03 16:52:59‎ توسط GreyCat)



  1. مترجم: Thomas Jefferson از مؤثرترین برپاکنندگان ایالات متحده و یکی از قدیمی‌ترین و برجسته‌ترین سیاستمداران و زمامداران امریکایی بود، او یکی از نویسندگان بیانیه استقلال امریکا، و سومین رییس جمهور این کشور بود. (1)


قابلیت تست اسکریپت


چگونگی افزودن قابلیت آزمایش کردن به برنامه‌ها

‎[توسط Jari Aalto] اگر شما در حال توسعه برنامه‌های بزرگتر می‌باشید، قابلیت آزمایش(آنچه برنامه انجام خواهد داد) قبل از استفاده واقعی، می‌تواند در تشخیص مشکلات، پیش از وقوع آنها در عمل، به شما کمک کند. در اینجا ما تابع ‎Run()‎ را تعریف می‌کنیم که برای نمایندگی تمام فرمانها به کار می‌رود. اگر وضعیت TEST فعال باشد، فرمانها به طور واقعی اجرا نمی‌شوند، بلکه فقط برای بازبینی در صفحه نمایش چاپ می‌شوند. حالت آزمایش با گزینه خط فرمان ‎-t‎ برنامه فعال می‌شود که از طریق دستور داخلی getopt پوسته Bash خوانده می‌شود.

قلب نمایش تجربی، تابع ‎Demo()‎ است که در آن می‌بینیم فراخوان‌ها چگونه آزمایش را به کار می‌بندند. دقت به خرج بدهید که موقع وجود هر فوق کاراکتر پوسته در فرمان، چگونه از نقل‌قولها استفاده می‌شود. همچنین توجه نمایید که چگونه به فراخوان ‎ 'Run'‎ در فراخوانی‌های داخل پوسته فرعی نیز نیاز دارید. نمایش فراخوان‌های پوسته فرعی تحت وضعیت آزمایش چنانکه از آخرین خروجی می‌توانید ببینید، محدود است.

می‌توانید راهکار آزمایش مشابهی به برنامه خودتان اضافه کنید، به وسیله: ‎ (1‎کپی ‎Run()‎ ‏ ‎(2‎ به کار گرفتن متغیر TEST‎ ‏‎(3‎ ویرایش تمام فراخونی‌های فرمان پوسته برای انجام ‎Run()‎. در عمل، قرار دادن برنامه پوسته به طور کامل تحت وضعیت آزمایش کردن خالص بسیار دشوار ست، زیرا ممکن است برنامه‌ها ساختارهای خیلی پیچیده‌ای از پوسته را استفاده کنند و وابسته به خروجی‌هایی باشند که توسط دستورات قبلی تولید می‌شوند. بازهم، امکان پیشرفت قابلیت آزمایش کردن بهتر از هیچ است و شانس بهتری برای بازبینی اجرای برنامه قبل از انجام آن در عمل، می‌باشد.

ادامه مطلب

BashLoadable


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

دستورات داخلی قابل بارگیری، به طور معمول باید از میان درخت منابع bash برای سیستم شما کامپایل بشوند:

.../bash-4.0$ CC=whatever ./configure
.../bash-4.0$ make
.../bash-4.0$ exec ./bash
.../bash-4.0$ cd examples/loadables/
.../loadables$ make
.../loadables$ enable -f finfo finfo
.../loadables$ help finfo

این مطلب نیاز به پایگاهی دارد که bash در آن می‌داند چگونه بارگیری اشیاء و کتابخانه‌های مشترک را پشتیبانی کند. در اکثر سیستم‌ها، bash این مورد را با تابع ‎dlopen()‎ پشتیبانی می‌کند. اگر شما در نگارشهای قدیمی‌تر ‎HP-UX‎ هستید، یک وصله وجود دارد: bash-4.2-shl.diff (نگارش قدیمی‌تر آن: bash-4.0-shl.diff) که توسط GreyCat ایجاد شده است.

همچنین اطلاعات کمی مفصل‌تر را در این آدرسها می‌توانید پیدا کنید:


CategoryShell

Bash قابل بارگیری (آخرین ویرایش ‎2012-10-05 13:51:15‎ توسط GreyCat)


Wrapper Script


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

اصلی‌ترین شکل یک اسکریپت wrapper این است:

#!/bin/sh
exec /some/weird/place/toolname ${1+"$@"}

به طور کلی، موقع نوشتن یک wrapper، ما قابل‌حمل‌ترین ترکیب دستوری ممکن را به کار می‌بریم. اگر تمام آنچه می‌خواهیم انجام بدهیم، انتقال دادن ورودی‌ها به برخی برنامه‌های دیگر است، معمولاً به کد تجملی، مختص-پوسته یا مختص-پلاتفرم نیازی نیست. در حقیقت، شاید کد فوق می‌توانست با یک پیوند نمادین جایگزین شده باشد. یک اسکریپت wrapper کمی واقع‌گرایانه‌تر، می‌تواند مانند این به نظر آید:

#!/bin/sh
CDR_SECURITY=8:dvd,clone,....
export CDR_SECURITY
exec cdrecord-prodvd ${1+"$@"}

این wrapper یک متغیر محیط را تنظیم می‌کند، و سپس یک برنامه دیگر را با همان شناسه‌ها و ورودی که اسکریپت wrapper دریافت کرده، فراخوانی می‌کند.

ادامه مطلب