آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ‌های رایج در Bash



توجه: برای آسان‌تر شدن ویرایش، FAQها، به صفحه‌های جداگانه تفکیک گردیدند. همچنین، برای بارگذاری سریعتر این صفحه، پاسخ‌ها به طور کامل در اینجا نیستند.

خوانندگان،برای خواندن پاسخ کامل روی پیوند [BashFAQ/nnn] پایین هر جواب کلیک کنند.

ویرایش کنندگان،لینک '[edit]' پایین هرمدخل را کلیک کنند. چیزی به این صفحه اضافه نکنید، به جای آن یک صفحه جدید فرعی با شماره پرسش معتبر ایجاد نمایید. (مترجم: این لینک‌ها در ترجمه فارسی به دلیل بلاموضوع بودن حذف گردیده‌اند)
با تشکر.

اینها پاسخ‌هایی هستند به پرسش‌هایی که به طور مکرر درکانال ‎#bash‎ روی IRC شبکه freenode مطرح گردیده‌اند. این پاسخ‌ها با همکاری اعضای ثابت کانال(originally heiner، و سپس دیگران شامل greycat و r00t)، و کاربرانی مانند شما، تنظیم شده‌اند. اگر شما مورد غیردقیق یا واقعاً ناصحیحی یافتید، با خیال راحت آنرا اصلاح کنید!

تمام اطلاعات موجود در اینجا بدون ضمانت و تضمین صحت می‌باشد. با مسئولیت خودتان به کار ببرید. وقتی تردید دارید، لطفاً صفحات man یا info گنو را به عنوان منابع تصدیق‌شده، کاوش کنید.

BASH پوسته سازگار با BourneShell است، که ویژگی‌های بسیاری به نیای خود افزوده است. اکثر آنها در KornShell، نیز معتبر هستند. جوابهای ارائه شده در این پرسش و پاسخها ممکن است به طرف Bash یا کوچکترین مخرج مشترک پوسته بورن گرایش داشته باشند، نسبت به آن که چه کسی آن پاسخ را نوشته باشد. در اکثر حالت‌ها، کوششی برای ارائه هردو پاسخ، قابل حمل(بورن)، و کارآمد(Bash، در جای مقتضی) به عمل آمده است. اگر پرسشی به طور دقیق مخصوص پوسته نیست، اماتا اندازه‌ای مربوط به یونیکس است، شاید پاسخ آن در UnixFaq باشد.

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

اگر نمی‌توانید پاسخ پرسشی که در جستجوی آن هستید را در اینجا پیدا کنید، BashPitfalls را بررسی نمایید. اگر می‌خواهید کمک کنید، می‌توانید به یک پرسش جدید در اینجا پاسخ بدهید، یاجوابگویی به یکی ازاینها( BashOpenQuestions) را امتحان کنید.

Bash FAQ رسمی Chet Ramey تکنیک‌های بسیاری دارد که در اینجا پوشش داده نشده‌اند.

  • ◯ فهرست

    1. چطور می‌توانم یک فایل(جریان داده، متغیر) را سطر به سطر بخوانم(و یا فیلد به فیلد)؟
    2. چگونه می‌توانم مقدار برگشتی یا خروجی دستوری را در یک متغیر ذخیره نمایم؟
    3. چطور می‌توانم آخرین(جدیدترین، قدیمی‌ترین، مسن‌ترین) فایل در یک دایرکتوری را پیدا کنم؟
    4. چگونه بررسی نمایم که آیا یک شاخه، خالی است یا خیر؟ چطور هر فایل ‎*.mpg‎ را بررسی کنم، یا تعداد آنها را شمارش کنم؟
    5. چگونه می توانم از متغیرهای آرایه‌ای استفاده کنم؟
    6. چطور می‌توانم از متغیرهای بی‌ثبات(متغیرهای غیر مستقیم، اشاره‌گرها، مرجع‌ها) یا آرایه‌های شرکت‌پذیر استفاده کنم؟
    7. آیا تابعی وجود دارد که طول یک رشته را بازگرداند؟
    8. چگونه می‌توانم تمام فایلها را به طور بازگشتی برای یک رشته جستجو نمایم؟
    9. میانگیری(buffering) چیست؟ یا، چرا این سطر فرمان من خروجی ندارد:    ‎ tail -f logfile | grep 'foo bar' | awk ...‎
    10. چطور می‌توانم یک ساختار دایرکتوری سلسله مراتبی بدون فایل ایجاد نمایم؟
    11. چگونه می‌توانم سطر شماره n از یک فایل را چاپ کنم؟
    12. به چه طریق می‌توانم یک فرمان شل را از یک برنامه غیرپوسته‌ای فراخوانی نمایم؟
    13. چگونه می‌توانم دو متغیر را به هم الحاق کنم؟ چگونه یک رشته را در یک متغیر اضافه(پیوست) کنم؟
    14. چطور می‌توانم چند دستور را در یک مرحله تغییر مسیر بدهم؟
    15. چگونه می‌توانم یک دستور را با تمام فایل‌های دارای پسوند ‎ .gz‎ اجرا کنم؟
    16. چگونه می‌توانم از AND/OR/NOT منطقی در الگو(جانشین) پوسته استفاده کنم؟
    17. چگونه می‌توانم عبارت‌ها را گروه‌بندی کنم، مثل ‎ (a AND b) OR c‎؟
    18. چگونه می‌توانم از اعدادی که با صفر شروع می‌شوند مثل 01 و 02 در یک حلقه استفاده کنم؟
    19. به کدام طریقه می‌توانم یک فایل را به محدوده‌هایی از سطرها، مانند سطرهای 1-10، 11-20، 21-30 تجزیه کنم؟
    20. چطور می‌توانم نام فایل‌های شامل کاراکتر فاصله یا سطر جدید یا هر دو را پیدا کرده وبا آنها کار کنم؟
    21. چگونه می‌توانم یک رشته را با رشته دیگری در یک متغیر، جریان داده، یک فایل، یاتمام فایلهای یک شاخه، تعویض نمایم؟
    22. چگونه می‌توانم به جای فقط اعداد صحیح، اعداد با ممیز شناور را در محاسبه استفاده کنم؟
    23. من می‌خواهم به پوسته محاوره‌ای که مستعارها و توابع ویژه‌ای دارد، نه آنها که در ‎ ~/.bashrc‎ کاربر هست، متصل شوم.
    24. من متغیرهایی را در حلقه تنظیم می‌کنم. چرا به طور ناگهانی پس از اتمام حلقه آنها ناپدید می‌شوند؟ یا، چرا نمی‌توانم داده را برای خواندن لوله‌کشی کنم؟
    25. چطور می‌توانم پارامترهای موضعی(مکانی) بعد از ‎ $9‎ را دستیابی کنم
    26. از چه طریق می‌توانم ترتیب سطرهای فایلی را تصادفی نمایم(بُر زدن)؟(یا یک سطر اتفاقی از فایل را انتخاب کنم، یا انتخاب یک فایل به طور تصادفی از یک شاخه.)
    27. چطور می‌توان دو پردازش جداگانه را به هم ارتباط داد؟
    28. چگونه می‌توانم محل اسکریپت خود را تعیین کنم؟ می‌خواهم فایلهای پیکربندی را از همان محل بخوانم.
    29. به چه طریق می‌توانم مقصد یک پیوند نمادین را نمایش بدهم؟
    30. چگونه می‌توانم تمام فایل‌های ‎ *.foo‎ را به ‎*.bar‎ تبدیل نمایم، یا فاصله‌ها را به خط زیر تبدیل کنم، و یا حروف بزرگ نام فایلها را به حروف کوچک تبدیل کنم؟
    31. تفاوت بین test و ‎[‎ و ‎ [[‎ چیست؟
    32. چطور می‌توانم خروجی 'time' را به یک متغیر یا فایل تغییر مسیر بدهم؟
    33. چگونه می‌توانم شماره شناسایی پردازشی با دادن نام آن پردازش به دست آورم؟
    34. آیا می‌توانم در Bash یک چرخنده اجرا کنم؟
    35. چگونه می‌توانم شناسه‌های( گزینه‌های ) خط‌فرمان را به آسانی مدیریت کنم؟
    36. چطور می‌توانم تمام سطرهایی را به دست آورم که: در هر دو فایل هستند(فصل مشترک) یا فقط در یکی از دوفایل می‌باشند(تفاوتها).
    37. چطور می‌توانم متن را با رنگهای مختلف چاپ کنم؟
    38. مجوزهای فایل در یونیکس چگونه کار می‌کنند؟
    39. تمام فایلهای نقطه‌ای که bash می‌خواند کدام هستند؟
    40. چگونه می‌توانم از dialog برای دریافت ورودی کاربر استفاده کنم؟
    41. چطور می‌توانم تعیین نمایم که آیا یک متغیر شامل یک زیر رشته هست؟
    42. چگونه می‌توانم دریابم که یک پردازش هنوز در حال اجرا است؟
    43. چرا job من در crontab ناموفق است؟‎ 0 0 * * * some command > /var/log/mylog.`date +%Y%m%d`‎
    44. چطور می‌توانم نوار پیشروی ایجاد کنم؟ چگونه می‌توانم موقع کپی یا انتقال فایلها، نمایشگر پیشروی را ببینم؟
    45. به چه طریق می‌توانم مطمئن شوم که فقط یک نمونه از اسکریپت در یک زمان معین در حال اجرا است(ممانعت دوطرفه)؟
    46. می‌خواهم بررسی کنم که آیایک کلمه در یک لیست وجود دارد( یایک عنصر عضوی از یک مجموعه هست).
    47. چطور می‌توانم stderr را به یک لوله تغییر مسیر بدهم؟
    48. فرمان eval و مسائل امنیت
    49. چگونه می‌توانم به روزرسانی‌های دوره‌ای یا پیوست کردن‌ها به یک فایل راببینم؟(مثل: رشد فایل log )
    50. من سعی دارم دستوری را در یک متغیر قرار بدهم، اما موارد پیچیده همیشه ناموفق است!
    51. من جستجوی تاریخچه درست مانند آن در tcsh می‌خواهم. چطور می‌توانم آن را به کلیدهای up و down مربوط کنم؟
    52. چطور می‌توانم یک فایل را از فرمت DOS به فرمت UNIX تبدیل کنم( CRها را از CR-LF خاتمه دهنده سطرها حذف کنم)؟
    53. من یک اعلان فرمان تفننی رنگی دارم، اما حالا به نظر نمی‌رسد bash بداند پهنای ترمینال من چقدر است. سطرها به طور نادرستی شکسته می‌شوند.
    54. چگونه می‌توانم بگویم که یک متغیر آیا محتوی یک عدد معتبر هست؟
    55. به طور کلی در باره ‎2>&1‎ بگویید -- تفاوت بین ‎2>&1 >foo‎ و ‎>foo 2>&1‎ چیست، و چه‌وقت می‌توانم از هرکدام استفاده کنم؟
    56. چطور می‌توانم چند فایل را به طور یکجا untar (یا unzip) نمایم؟
    57. چطور می‌توانم اقلام را گروه‌بندی نمایم(در یک فایل با پیشوندهای مشترک)؟
    58. آیا bash می‌تواند داده‌های باینری را اداره کند؟
    59. من این دستور را در جایی دیدم: ‎:(){ :|:& }‎ (بمب خوشه‌ای). این چطور کار می‌کند؟
    60. من سعی می‌کنم اسکریپتی بنویسم که دایرکتوری جاری را تغییر دهد( یا یک متغیر را تنظیم کند)، اما بعد از به پایان رسیدن اسکریپت، در همان جایی هستم که از آنجا شروع کرده بودم(یا متغیر من نیست)!
    61. آیا لیستی از ویژگی‌های اضافه شده به یک نگارش معین Bash وجود دارد؟
    62. چطور می‌توانم در یک حالت ایمِن، یک فایل موقتی ایجاد کنم؟
    63. وقتی من می‌خواهم بعد از اجرای یک job پس‌زمینه‌ای راه دور قطع ارتباط کنم، سرویس‌گیرنده ssh من هنگ می‌کند !
    64. چرا دریافت پاسخ پرسشی که من در ‎ #bash‎ پرسیدم، تا این اندازه دشوار است؟
    65. آیا یک دستور "PAUSE" مانند آن که در اسکریپتهای MSDOS هست، در bash وجود دارد؟ که به کاربر اعلام نماید جهت ادامه کلیدی را بزند؟
    66. می‌خواهم عبارت ‎if  [[ $var == foo || $var == bar || $var == more ... ]]‎ را بدون n مرتبه تکرار ‎$var‎، بررسی کنم.
    67. چطور می‌توانم فضای سفید قبل یا بعد یکی از متغیرهایم را پاک کنم؟
    68. چگونه می‌توانم فرمانی را اجرا کنم و انصراف از آن پس از N ثانیه را داشته باشم(timeout)؟
    69. می‌خواهم یک ارتباط ssh (یا scp، یا sftp) را خودکار نمایم، اما نمی‌دانم چطور کلمه عبور را ارسال کنم
    70. چطور می‌توانم زمان یونیکس(epoch) را به مقادیر قابل خوندن انسانی تبدیل نمایم؟
    71. چطور می‌توانم یک کاراکتر اسکی را به مقدار دسیمال(یا هگزادسیمال) آن و برعکس تبدیل نمایم؟
    72. چگونه می‌توانم مطمئن شوم که محیط من برای برنامه‌های cron، batch، و jobs پیکربندی شده است؟
    73. چگونه می‌توانم از بسط پارامتر استفاده کنم؟ چطور زیر رشته‌ها را ایجاد کنم؟ چگونه می‌توانم نام فایل را بدون پسوند کنم، یا فقط پسوند فایل‌ها را به دست آورم؟
    74. چگونه می‌توانم اثرات بسط پارامترهای جالب Bash را درپوسته‌های قدیمی‌تر داشته باشم؟
    75. چطور می‌توانم از فرمان find استفاده کنم؟ من به هیچ وجه نمی‌توانم صفحه man را درک کنم!
    76. چگونه می‌توانم حاصل جمع تمام اعداد در یک ستون را به دست آورم؟
    77. از چه طریق می‌توانم تاریخچه را در فایل log ثبت کنم یا bash را در برابر پاک کردن آن ایمن نمایم؟
    78. من می‌خواهم یک کلمه عبور کاربر را با استفاده ازفرمان passwd یونیکس ایجاد کنم، اما چطور آن را در اسکریپت قرار بدهم؟ ورودی استاندارد را نمی‌خواند!
    79. چطور می‌توانم grep را برای یافتن سطرهای شاملfoo و bar همچنین foo یا bar به کار ببرم؟ یا برای فایل‌های شامل foo و bar، شاید در سطرهای جداگانه؟
    80. چگونه می‌توانم مستعاری ایجاد کنم که یک شناسه دریافت کند؟
    81. چگونه می‌توانم تعیین کنم که یک فرمان آیا در جایی از PATH من وجود دارد؟
    82. چرا‎ $(...) ‎نسبت به ‎ `...` ‎  (نقل‌قول برعکس) ارجحیت دارد؟
    83. چگونه می توانم تعیین کنم که یک متغیر آیا قبلاً تعریف شده است؟
    84. چگونه یک رشته (یا عدد بلند، یا عدد منفی) از یک تابع باز گردانم؟ return فقط استفاده از اعداد 0 تا 255 را اجازه می‌دهد.
    85. چگونه می‌توان چند مرتبه در فایل fifo بدون باز کردن مجدد آن، نوشت؟
    86. چگونه می‌توان هنگام اجرای یک فرمان از مستعارها یا توابع صرفنظر کرد؟
    87. از چه طریقی بدون استفاده از تفکیک خروجی ‎ ls -l‎ می‌توانم مجوزها(یا سایراطلاعات) فایلی را دریافت کنم؟
    88. چطور می‌شود از فقدان هر یک از سطرهای تاریخچه اجتناب نمود؟
    89. من در حال خواندن سطر به سطر یک فایل, و اجرای ssh یا ffmpeg هستم، اما فقط سطر اول پردازش می‌شود!
    90. چگونه می‌توانم متنی را در ابتدای یک فایل درج کنم(برعکس ‎>>‎
    91. من تلاش می‌کنم تعداد سطرها و ستونهای ترمینال خود را دریافت کنم، اما متغیرهای COLUMNS و LINES همیشه تهی هستند
    92. چگونه یک اسکریپت CGI بنویسم که پارامترها را بپذیرد؟
    93. چطور می‌توانم محتویات نوار عنوان ترمینال خود را تنظیم نمایم؟
    94. می‌خواهم وقتی دیسک پُر می‌شود یک هشدار دریافت کنم(با تجزیه خروجی df ).
    95. میخواهم لیست خیلی بلند شناسه‌ها را دریافت کنم. چطور می‌توانم یک لیست بزرگ قابل توجه را پردازش نمایم؟
    96. ssh کرانه‌های کلمات مرا می‌خورد! نمی‌توانم ‎ ssh remotehost make CFLAGS="-g -O"‎ را انجام بدهم!
    97. چطور می‌توانم تعیین کنم که یک پیوند نمادین آیا منفصل (شکسته) است؟
    98. چگونه پشتیبانی محلی را به اسکریپت‌های bash اضافه می‌کنید؟
    99. چطور می‌توانم جدیدترین(یا قدیمی‌ترین) فایل یک شاخه را به دست آورم؟
    100. در bash چگونه می‌توانم رشته‌ها را دستکاری کنم؟
    101. توابع سودمند عمومی(warn و die)
    102. چگونه اختلاف بین دو تاریخ را به دست آورم؟
    103. چطور بررسی نمایم که فایل دریک ماه معین یا در یک محدوده تاریخی ویرایش شده است؟
    104. چرا ‎ foo=bar echo "$foo"‎ رشته bar را چاپ نمی‌کند؟
    105. چرا ‎ set -e‎(یا ‎ set -o errexit‎ یا‎ trap ERR‎) آنچه را انتظار دارم انجام نمی‌دهد؟
    106. می‌خواهم از داخل اسکریپت stdout را به یک فایل ثبت وقایع tee نمایم. و شاید stderr را به همچنین.
    107. چگونه به هر سطر یک جریان مُهرتاریخ بزنم؟
    108. چطور در انتظار انجام چند پردازش فرزند بمانم؟
    109. چگونه می‌توانم بگویم که اسکریپت من آیا منبع شده(به طور نقطه‌ای) یا اجرا گردیده است؟
    110. آیا می‌توانم چیزی مشابه قالب‌ها(templates) را با bash به کار ببرم؟

    1. 1. چطور می‌توانم یک فایل(جریان داده، متغیر) را سطر به سطر بخوانم(و یا فیلد به فیلد)؟

      استفاده از "for" را امتحان نکنید . از یک حلقه while و فرمان read استفاده کنید:

      2. چگونه می‌توانم مقدار برگشتی یا خروجی دستوری را در یک متغیر ذخیره نمایم؟

      خوب، بستگی دارد به اینکه آیا می‌خواهید خروجی فرمان را ذخیره کنید(هر یک از stdout یا stdout + stderr) یا وضعیت خروج آن(0 تا 255، به طور نوعی در ازای 0 به معنی موفقیت).

      3. چطور می‌توانم آخرین(جدیدترین، قدیمی‌ترین، مسن‌ترین) فایل در یک دایرکتوری را پیدا کنم؟

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

      4. چگونه بررسی نمایم که آیا یک شاخه، خالی است یا خیر؟ چطور هر فایل ‎*.mpg‎ را بررسی کنم، یا تعداد آنها را شمارش کنم؟

      در Bash، می‌توانید این کار را به طور مطمئن و به آسانی با گزینه‌های nullglob و dotglob (که رفتار globbing را تغییر می‌دهند) و یک آرایه انجام دهید:

      5. چگونه می توانم از متغیرهای آرایه‌ای استفاده کنم؟

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

      6. چطور می‌توانم از متغیرهای بی‌ثبات(متغیرهای غیر مستقیم، اشاره‌گرها، مرجع‌ها) یا آرایه‌های شرکت‌پذیر استفاده کنم؟

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

      7. آیا تابعی وجود دارد که طول یک رشته را بازگرداند؟

      سریع‌ترین روش، نیازی به برنامه‌های خارجی ندارد(اما در پوسته بورن قابل استفاده نمی‌باشد):

      8. چگونه می‌توانم تمام فایلها را به طور بازگشتی برای یک رشته جستجو نمایم؟

      90% اوقات، تمام آنچه لازم دارید یکی از اینهاست:

      9. میانگیری چیست؟ یا، چرا این سطر فرمان من خروجی ندارد:    ‎ tail -f  logfile | grep 'foo bar' | awk ...‎

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

      10. چطور می‌توانم یک ساختار دایرکتوری سلسله مراتبی بدون فایل ایجاد نمایم؟

      با برنامه cpio :

      11. چگونه می‌توانم سطر شماره n از یک فایل را چاپ کنم؟

      یک روش زمخت(بلکه غیر سریع)این است:

      12. به چه طریق می‌توانم یک فرمان شل را از یک برنامه غیرپوسته‌ای فراخوانی نمایم؟

      13. چگونه می‌توانم دو متغیر را به هم الحاق کنم؟ چگونه یک رشته را در یک متغیر اضافه(پیوست) کنم؟

      در شل عملگری(صریح) برای الحاق نمودن رشته‌ها (لفظی یا بدون ارجاع به متغیر) وجود ندارد، فقط می‌توانید آنها را در مجاورت هم بنویسید:

      14. چطور می‌توانم چند دستور را در یک مرحله تغییر مسیر بدهم؟

      تغییر مسیر یک فرمان منفرد به همین آسانی است:

      15. چگونه می‌توانم یک دستور را با تمام فایل‌های دارای پسوند ‎ .gz‎ اجرا کنم؟

      غالباً یک فرمان تعدادی فایل را به عنوان شناسه می‌پذیرد، به عنوان مثال

      16. چگونه می‌توانم از AND/OR/NOT منطقی در الگو(جانشین) پوسته استفاده کنم؟

      "Glob"ها الگوهای ساده‌ای هستند که می‌توانند برای مطابقت نام فایلها و رشته‌ها به کار بروند. به طور معمول آنها خیلی قدرتمند نمی‌باشند. اگر قدرت بیشتری لازم دارید، چند گزینه در دسترس است.

      17. چگونه می‌توانم عبارت‌ها را گروه‌بندی کنم، مثل ‎ (a AND b) OR c‎؟

      روش قابل حمل(POSIX یا Bourne) استفاده از چندین فرمانtest (یا‎ [‎) است:

      18. چگونه می‌توانم از اعدادی که با صفر شروع می‌شوند مثل 01 و 02 در یک حلقه استفاده کنم؟

      به طور معمول، چند روش برای حل مشکل موجود است، هریک با مزایا و معایب خاص خود.

      19. به کدام طریقه می‌توانم یک فایل را به محدوده‌هایی از سطرها، مانند سطرهای 1-10، 11-20، 21-30 تجزیه کنم؟

      برخی سیستم‌های یونیکس برنامه سودمند split را برای این منظور فراهم می‌کنند:

      20. چطور می‌توانم نام فایل‌های شامل کاراکتر فاصله یا سطر جدید یا هر دو را پیدا کرده وبا آنها کار کنم؟

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

      چگونه می‌توانم یک رشته را با رشته دیگری در یک متغیر، جریان داده، یک فایل، یاتمام فایلهای یک شاخه، تعویض نمایم؟

      یک تعداد ابزار برای این مورد در دسترس است. که استفاده از هریک به عوامل زیادی بستگی دارد، مهمترین آنها البته آن است که چه چیزی را ویرایش می‌کنیم.

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

      حسابگر داخلی BASH فقط از اعداد صحیح استفاده می‌کند:

      من می‌خواهم به پوسته محاوره‌ای که مستعارها و توابع ویژه‌ای دارد، نه آنها که در ‎ ~/.bashrc‎ کاربر هست، متصل شوم.

      فقط یک فایل شروع اولیه(start-up) متفاوت تعیین کنید:

      من متغیرهایی را در حلقه تنظیم می‌کنم. چرا به طور ناگهانی پس از اتمام حلقه آنها ناپدید می‌شوند؟ یا، چرا نمی‌توانم داده را برای خواندن لوله‌کشی کنم؟

      در اکثر پوسته‌ها، هر یک از فرمانهای یک لوله در پوسته فرعی جداگانه‌ای اجرا می‌گردد. نه در پوسته کاری:

      چطور می‌توانم پارامترهای موضعی(مکانی) بعد از ‎ $9‎ را دستیابی کنم

      به جای ‎$10‎ از ‎${10}‎ استفاده کنید. این در BASH و KornShell کار می‌کند، اما در پیاده‌سازی‌های قدیمی BourneShell کار نمی‌کند. یک روش دیگر برای دستیابی به پارامترهای مکانی بعد از ‎ $9‎ استفاده از for است، به عنوان مثال, برای به دست آوردن آخرین پارامتر:

      از چه طریق می‌توانم ترتیب سطرهای فایلی را تصادفی نمایم(بُر زدن)؟(یا یک سطر اتفاقی از فایل را انتخاب کنم، یا انتخاب یک فایل به طور تصادفی از یک شاخه.)

      یک راهکاری برای تصادفی نمودن سطرها در اینجا هست. این روش تولید یک عدد تصادفی است که پیشوند هر سطر می‌شود ، سپس سطرهای حاصل، مرتب می‌گردند و اعداد حذف می‌شوند.

      چطور می‌توان دو پردازش جداگانه را به هم ارتباط داد؟

      دو فرآیند نا مرتبط نمی‌توانند از شناسه‌ها، محیط یا stdin/stdout برای مراوده استفاده کنند، برخی اشکال ارتباط درون فرآیندی(IPC) لازم است.

      چگونه می‌توانم محل اسکریپت خود را تعیین کنم؟ می‌خواهم فایلهای پیکربندی را از همان محل بخوانم.

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

      به چه طریق می‌توانم مقصد یک پیوند نمادین را نمایش بدهم؟

      فرمان غیر استاندارد خارجی ‎readlink(1)‎ می‌تواند برای نمایش مقصد لینک نمادین استفاده شود:

      چگونه می‌توانم تمام فایل‌های ‎ *.foo‎ را به ‎*.bar‎ تبدیل نمایم، یا فاصله‌ها را به خط زیر تبدیل کنم، و یا حروف بزرگ نام فایلها را به حروف کوچک تبدیل کنم؟

      برخی توزیع‌های گنو-لینوکس دارای فرمان‎ rename(1)‎ هستند، که می‌توانید برای این کار استفاده کنید، به هرحال نحوه ترکیب دستوری(syntax) آن از یک توزیع به دیگری تفاوت دارد، بنابراین پاسخ قابل حملی نیست....

      تفاوت بین test و ‎[‎ و ‎ [[‎ چیست؟

      [‎(فرمان test) و ‎ [[‎ (فرمان جدید test) برای ارزیابی عبارتها به کار می‌روند. ‎ [[‎ فقط در پوسته Bash و Korn کار می‌کند، و قدرتمندتر می‌باشد،‎ [‎ و test در پوسته‌های POSIX معتبر هستند. چند مثال در اینجا هست:

      چطور می‌توانم خروجی 'time' را به یک متغیر یا فایل تغییر مسیر بدهم؟

      کلمه کلیدی time در پوسته Bash نیرنگ خاصی را به کار می‌برد، به طوری که می‌توانید مواردی مانند این را انجام دهید

      چگونه می‌توانم شماره شناسایی پردازشی با دادن نام آن پردازش به دست آورم؟

      به طور معمول به پردازش با استفاده از شماره شناسایی پردازش(PID) رجوع می‌شود، و فرمان‎ ps(1)‎ می‌تواند اطلاعات هر پردازشی با شماره شناسایی ID داده شده را نمایش بدهد، به عنوان مثال

      آیا می‌توانم در Bash یک چرخنده اجرا کنم؟

      مطمئناً!

      چگونه می‌توانم شناسه‌های( گزینه‌های ) خط‌فرمان را به آسانی مدیریت کنم؟

      خوب، تا اندازه بسیاری بستگی به آن دارد که با آنها چه کار می‌خواهید انجام بدهید. چندین راهکار موجود است، ، هرکدام باضعف و قوت‌های خود.

      چطور می‌توانم تمام سطرهایی را به دست آورم که: در هر دو فایل هستند(فصل مشترک) یا فقط در یکی از دوفایل می‌باشند(تفاوتها).

      از فرمان‎ comm(1)‎ استفاده کنید:

      چطور می‌توانم متن را با رنگهای مختلف چاپ کنم؟

      با رشته‌های escape کدهای ANSI در برنامه خود انجام ندهید! فرمان tput به شما اجازه می‌دهد به یک روش سالم با بانک اطلاعات ترمینال خود محاوره کنید:

      مجوزهای فایل در یونیکس چگونه کار می‌کنند؟

      مجوزها را ملاحظه کنید.

      تمام فایلهای نقطه‌ای که bash می‌خواند کدام هستند؟

      بخش فایلهای نقطه‌ای را ملاحظه کنید.

      چگونه می‌توانم از dialog برای دریافت ورودی کاربر استفاده کنم؟

      در اینجا یک نمونه هست:

      چطور می‌توانم تعیین نمایم که آیا یک متغیر شامل یک زیر رشته هست؟

      در BASH:

      چگونه می‌توانم دریابم که یک پردازش هنوز در حال اجرا است؟

      فرمان kill برای ارسال سیگنالها به پردازش در حال اجرا به کار می‌رود. به عنوان یک عمل راحت، سیگنال "0" که موجود نیست می‌تواند برای پی بردن به در حال اجرا بودن یک پردازش به کار برود:

      چرا این job من در crontab ناموفق است؟
      0 0 * * * some command > /var/log/mylog.`date +%Y%m%d`‎

      در بسیاری از نگارش‌های crontab، با علامت‎ (%)‎ به طور ویژه‌ای رفتار می‌شود، و بنابراین باید با کاراکتر گریز \ پوشش داده شود:

      چطور می‌توانم نوار پیشروی ایجاد کنم؟ چگونه می‌توانم موقع کپی یا انتقال فایلها، نمایشگر پیشروی را ببینم؟

      آسان‌ترین روش افزودن نوار پیشرفت به اسکریپت خودتان، استفاده از ‎ dialog --gauge‎ است. در اینجا مثالی هست که متکی به ویژگی‌های BASH می‌باشد:

      به چه طریق می‌توانم مطمئن شوم که فقط یک نمونه از اسکریپت در یک زمان معین در حال اجرا است(ممانعت دوطرفه)؟

      برخی وسائل ممانعت دوجانبه لازم داریم. یک روش، استفاده از "lock" است: هر تعداد از پردازشها می‌توانند به طور همزمان برای بدست آوردن قفل تلاش نمایند، اما فقط یکی از آنها موفق می‌شود.

      می‌خواهم بررسی کنم که آیایک کلمه در یک لیست وجود دارد( یایک عنصر عضوی از یک مجموعه هست).

      اگر پرسش واقعی شما چطور می‌توانم بررسی کنم که آیا یکی ازپارامترهایم ‎ -v‎ است؟ می‌باشد، پس لطفاً FAQ #35 را ملاحظه کنید.در غیر اینصورت، خواندن را ادامه دهید....

      چطور می‌توانم stderr را به یک لوله تغییر مسیر بدهم؟

      یک لوله فقط می‌تواند خروجی استاندارد‎ (stdout)‎ برنامه را حمل کند. برای عبور دادن خروجی استاندارد خطا ‎ (stderr)‎ از میان لوله، لازم است stderr را به همان مقصد stdout تغییر مسیر بدهید. به طور اختیاری برای دریافت stderr تنها، می‌توانید stdout را ببندید یا به ‎ /dev/null‎ تغییر مسیر بدهید. چند نمونه کُد:

      فرمان eval و مسائل امنیت

      فرمان eval برای سوءاستفاده به شدت قدرتمند و بینهایت آسان است.

      چگونه می‌توانم به روزرسانی‌های دوره‌ای یا پیوست کردن‌ها به یک فایل راببینم؟(مثل: رشد فایل log )

      tail -f‎ رشد یک فایل ثبت وقایع را به شما نشان می‌دهد. در بعضی سیستم‌ها(برای مثال OpenBSD)، این به طور خودکار تبدیل یک فایل لاگ به فایل جدیدی با همان نام را دنبال می‌کند(که به طور معمول همانست که شما می‌خواهید). برای حاصل نمودن همین توانایی در سیستم‌های گنو به جای آن ‎ tail -F‎ را به کار ببرید.

      من سعی دارم دستوری را در یک متغیر قرار بدهم، اما موارد پیچیده همیشه ناموفق است!

      برخی اشخاص کوشش می‌کنند چیزی مانند این را انجام بدهند:

          # مثالی که کار نمی‌کند
          args="-s 'The subject' $address"
          mail $args < $body

      من جستجوی تاریخچه درست مانند آن در tcsh می‌خواهم. چطور می‌توانم آن را به کلیدهای up و down مربوط کنم؟

      فقط سطرهای زیر را در فایل ‎/etc/inputrc‎ یا فایل‎ ~/.inputrc‎ خود اضافه کنید:

      چطور می‌توانم یک فایل را از فرمت DOS به فرمت UNIX تبدیل کنم( CRها را از CR-LF خاتمه دهنده سطرها حذف کنم)؟

      کاراکترهای رفتن سر سطر‎ (CRs)‎ در برخی سیستم‌ها برای علامت زدن انتهای سطر به کار می‌روند. سه نوع مختلف انتهای سطر رایج است:

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

      شما باید ‎ \[ and \]‎ را در اطراف هر یک از رشته‌های escape غیرقابل چاپ در اعلان خود قرار بدهید. از این قرار:

      چگونه می‌توانم بگویم که یک متغیر آیا محتوی یک عدد معتبر هست؟

      اول، شما باید معین کنید مفهوم شما از «عدد» چیست. در اکثر حالت‌های رایج که مردم این مورد را سؤال می‌کنند، به نظر می‌رسد منظور «یک عدد صحیح غیر منفی، بدون علامت + » است. یا به بیان دیگر رشته‌ای از تمام ارقام. سایر اوقات، افراد می‌خواهند یک ورودی ممیز شناور با علامت و نقطه اعشار اختیاری را تعیین اعتبار نمایند.

      به طور کلی در باره ‎2>&1‎ بگویید -- تفاوت بین ‎2>&1 >foo‎ و ‎>foo 2>&1‎ چیست، و چه‌وقت می‌توانم از هرکدام استفاده کنم؟

      تمام پردازشهای Bash به ترتیب از چپ به راست تغییر مسیر داده می‌شوند. و ترتیب معنا دار است. انحراف از آن در یک فرمان ممکن است نتایج آن فرمان را تغییر بدهد.

      چطور می‌توانم چند فایل را به طور یکجا untar (یا unzip) نمایم؟

      چون فرمان tar در اصل طوری طراحی شده بود که از دستگاه‌های نوار گردان مغناطیسی بخواند یا در آن بنویسد(کلمهtar از ‎ Tape ARchiver‎)، شما به طور خاص فقط می‌توانید نام فایلها را در بایگانی قرار دهید(نوشتن در نوار) یا آنها را از یک آرشیو استخراج نمایید(خواندن از نوار).

      چطور می‌توانم اقلام را گروه‌بندی نمایم(در یک فایل با پیشوندهای مشترک)؟

      چنان که شخصی بخواهد این را تبدیل کند:

      آیا bash می‌تواند داده‌های باینری را اداره کند؟

      به طور اساسی، پاسخ خیر است....

      من این دستور را در جایی دیدم: ‎:(){ :|:& }‎ (بمب خوشه‌ای). این چطور کار می‌کند؟

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

      من سعی می‌کنم اسکریپتی بنویسم که دایرکتوری جاری را تغییر دهد( یا یک متغیر را تنظیم کند)، اما بعد از به پایان رسیدن اسکریپت، در همان جایی هستم که از آنجا شروع کرده بودم(یا متغیر من نیست)!

      این را ملاحظه نمایید:

         #!/bin/sh
         cd /tmp

      آیا لیستی از ویژگی‌های اضافه شده به یک نگارش معین Bash وجود دارد؟

      در اینجا پیوندهایی به مستندات رسمی Bash آمده است:

      چطور می‌توانم در یک حالت ایمِن، یک فایل موقتی ایجاد کنم؟

      پرسش شایسته. بعداً کامل می‌شود. (اشارات موقتی: tempfile قابل حمل نیست. mktemp به طور وسیع‌تری وجود دارد، اما برای ایجاد فایل از قبل، ممکن است مستلزم گزینه ‎ -c‎ باشد، یا ممکن است به طور پیش‌فرض فایل را ایجاد کند و اگر ‎ -c‎ فراهم شده باشد، آن را رها کند. برخی سیستم‌ها هیچ یک از دو فرمان را ندارند(سولاریس و POSIX). ظاهراً فرمان منفردی که واقعاً در هر جایی کار کند وجود ندارد)

      وقتی من می‌خواهم بعد از اجرای یک job پس‌زمینه‌ای راه دور قطع ارتباط کنم، سرویس‌گیرنده ssh من هنگ می‌کند !

      کُد زیر آنچه انتظار دارید را انجام نخواهد داد:

         ssh me@remotehost 'sleep 120 &'
         # Client hangs for 120 seconds

      چرا دریافت پاسخ پرسشی که من در ‎ #bash‎ پرسیدم، تا این اندازه دشوار است؟

      شاید هیچ کس جواب را نداند( یا افرادی که می‌دانند مشغول هستند). شاید شما توضیح کافی در باره مشکل نداده‌اید، یا شما مشکل را به طور شفاف بیان نکرده‌اید. شاید سؤالی که پرسیده‌اید در این FAQ پاسخ داده شده است، یا در تله‌های Bash، یا در راهنمای BashGuide.

      آیا یک دستور "PAUSE" مانند آن که در اسکریپتهای MSDOS هست، در bash وجود دارد؟ که به کاربر اعلام نماید جهت ادامه کلیدی را بزند؟

      کُد زیر را برای انتظار تا فشردن کلید اینتر توسط کاربر به کار ببرید:

      می‌خواهم بدون n مرتبه تکرار ‎ $var‎، عبارت ‎ $var == more ...‎ یا ‎ $var == bar‎ یا ‎   if [[ $var == foo ‎ را بررسی کنم.

      چاره کار استفاده از case می‌باشد:

      چطور می‌توانم فضای سفید قبل یا بعد یکی از متغیرهایم را پاک کنم؟

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

      چگونه می‌توانم فرمانی را اجرا کنم و انصراف از آن پس از N ثانیه را داشته باشم(timeout)

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

      می‌خواهم یک ارتباط ssh (یا scp، یا sftp) را خودکار نمایم، اما نمی‌دانم چطور کلمه عبور را ارسال کنم....

      ایست!

      چطور می‌توانم زمان یونیکس(epoch) را به مقادیر قابل خواندن انسانی تبدیل نمایم؟

      تنها روش سالم مدیریت مقادیر زمان در داخل یک برنامه، تبدیل آنها به مقیاس خطی است. شما نمی‌توانید‎"January 17, 2005 at 5:37 PM"‎ را در متغیر ذخیره کنید و انتظار انجام کاری را با آن داشته باشید....

      چطور می‌توانم یک کاراکتر اسکی را به مقدار دسیمال(یا هگزادسیمال) آن و برعکس تبدیل نمایم؟

      اگر شما یک مقدار معین هگزادسیمال یا اُکتال دارید(در زمان نوشتن اسکریپت)، دقیقاً می‌توانید printf را به کار ببرید:

      چگونه می‌توانم مطمئن شوم که محیط من برای برنامه‌های cron، batch، و jobs پیکربندی شده است؟

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

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

      برای آموزش دستکاری رشته FAQ شماره 100 را ببینید، این صفحه مقداری از همان اطلاعات را شامل می‌شود، اما به شکلی فشرده‌تر.

      چگونه می‌توانم اثرات بسط پارامترهای جالب Bash را درپوسته‌های قدیمی‌تر داشته باشم؟

      اکثر بسط پارامترهای توسعه یافته، در پوسته قدیمی‌تر BourneShell کار نمی‌کنند. اگر لازم است کُد شما به خوبی قابل حمل به آن شل باشد، اغلب sed و expr می‌توانند استفاده شوند.

      چطور می‌توانم از فرمان find استفاده کنم؟ من به هیچ وجه نمی‌توانم صفحه man را درک کنم!

      بخش کاربرد Find را ملاحظه کنید.

      چگونه می‌توانم حاصل جمع تمام اعداد در یک ستون را به دست آورم؟

      این سؤال و تمام پرسش‌های مشابه آن با یک AWK یک سطری پاسخ داده می‌شوند.

      از چه طریق می‌توانم تاریخچه را در فایل log ثبت کنم یا bash را در برابر پاک کردن آن ایمن نمایم؟

      اگر شما یک کاربر پوسته هستید که می‌خواهد فعالیت‌های خود را ضبط نماید، FAQ #88 را ملاحظه کنید. اگر شما یک مدیر سیستم می‌باشید که می‌خواهد بداند چطور می‌تواندکشف کند، یک کاربر موقعی که تاریخچه پوسته‌اش را به ‎ /dev/null‎ فرستاده یا آن را غیر فعال نموده، چه چیز اجرا کرده است، چند مشکل برای این مورد وجود دارد....

      من می‌خواهم یک کلمه عبور کاربر را با استفاده ازفرمان passwd یونیکس ایجاد کنم، اما چطور آن را در اسکریپت قرار بدهم؟ ورودی استاندارد را نمی‌خواند!

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

      { echo oldpass; echo newpass; echo newpass; } | passwd
      # !این کار نمی‌کند

      چطور می‌توانم grep را برای یافتن سطرهای شاملfoo و bar همچنین foo یا bar به کار ببرم؟ یا برای فایل‌های شامل foo و bar، شاید در سطرهای جداگانه؟

      این در واقع سه پرسش مختلف است، بنابراین ما پاسخ را به سه قسمت تفکیک کرده‌ایم.

      چگونه می‌توانم مستعاری ایجاد کنم که یک شناسه دریافت کند؟

      نمی‌ توانید. مستعارها در bash بینهایت ابتدایی هستند، و در حقیقت برای هیچ مقصود جدی مناسب نمی‌باشند. حتی صفحه مستندات bash به طور صریح می‌گوید:

      چگونه می‌توانم تعیین کنم که یک فرمان آیا در جایی از PATH من وجود دارد؟

      POSIX فرمان داخلی به نام command تعیین می‌کند، که می‌تواند برای این منظور به کار برود:

      چرا‎ $(...) ‎نسبت به ‎ `...` ‎  (نقل‌قول برعکس) ارجحیت دارد؟

      به چند دلیل:

      چگونه می توانم تعیین کنم که یک متغیر آیا قبلاً تعریف شده است؟

      چند روش برای تعیین آنکه آیا متغیر تعریف شده‌ای مقدار غیر تهی دارد، موجود است. اینجا رایج‌ترین آنها، به ترتیب از بیشترین تا کمترین قابلیت حمل آمده است:

      چگونه یک رشته (یا عدد بلند، یا عدد منفی) از یک تابع باز گردانم؟ return فقط استفاده از اعداد 0 تا 255 را اجازه می‌دهد.

      توابع در Bash (همچنین سایر پوسته‌های هم خانواده شل Bourne) مانند فرمانها کار می‌کنند: یعنی، آنها فقط یک وضعیت خروج برمی‌گردانند، که منحصر به اعداد صحیح از 0 تا 255 است. این به منظور استفاده در علامت‌دهی خطاها می‌باشد، نه برای بازگرداندن نتایج محاسبات یا سایر داده‌ها.

      چگونه می‌توان چند مرتبه در فایل fifo بدون باز کردن مجدد آن، نوشت؟

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

      چگونه می‌توان هنگام اجرای یک فرمان از مستعارها یا توابع صرفنظر کرد؟

      گاهی اوقات صرف نظر کردن از مستعارها (و توابع، از جمله توایع داخلی پوسته) سودمند است. به عنوان مثال، شاید در سیستم خود این تنظیم را داشته باشید:

      از چه طریقی بدون استفاده از تفکیک خروجی ‎ ls -l‎ می‌توانم مجوزها(یا سایراطلاعات) فایلی را دریافت کنم؟

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

      چطور می‌شود از فقدان هر یک از سطرهای تاریخچه اجتناب نمود؟

      این روش برای آن طراحی شده تا به شما امکان بدهدثبت وقایع دوستانه کاملی از تمام فرمانهای اجرا شده توسط کاربر را ذخیره کنید، مقصود از آن حسابرسی امن فرمانها نمی‌باشد -بخش امنیت bash در برابر پاکسازی تاریخچه را ببینید.

      من در حال خواندن سطر به سطر یک فایل, و اجرای ssh یا ffmpeg هستم، اما بعد از اولین سطر هر چیزی خورده می‌شود!

      موقع خواندن سطر به سطر فایل، اگر یک دستور در داخل حلقه نیز stdin را بخواند، می‌تواند فایل ورودی را تمام کند، برای مثال:

      چگونه می‌توانم متنی را در ابتدای یک فایل درج کنم(برعکس ‎>>‎

      نمی‌توانید آنرا به تنهایی با تغییر مسیر bash انجام دهید، برعکس‎>>‎ وجود ندارد....

      من تلاش می‌کنم تعداد سطرها و ستونهای ترمینال خود را دریافت کنم، اما متغیرهای COLUMNS و LINES همیشه تهی هستند

      در شل‌های محاوره‌ای COLUMNS و LINES فقط توسط BASH تنظیم می‌شوند، آنها در اسکریپت عمل نمی‌کنند. به جای آن می‌توانید از اینها استفاده کنید:

      چگونه یک اسکریپت CGI بنویسم که پارامترها را بپذیرد؟

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

      چطور می‌توانم محتویات نوار عنوان ترمینال خود را تنظیم نمایم؟

      اگر ترمینالی دارید که رشته‌های escape سازگار با xterm را می‌فهمد، و شما دقیقاً می‌خواهید یکباره عنوان آن را تنظیم کنید، می‌توانید از چنین تابعی استفاده کنید:

      می‌خواهم وقتی دیسک پُر می‌شود یک هشدار دریافت کنم(با تجزیه خروجی df ).

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

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

      ابتدا، بیایید برخی موضوعات زمینه‌ای را بازبینی کنیم. موقعی که یک پردازش می‌خواهد پردازش دیگری را اجرا کند، یک فرزند ‎fork()‎(منشعب) می‌کند، و پردازش فرزند یکی از فراخوان‌های سیستمی خانواده ‎exec*‎ (مانند‎execve()‎)، را با دادن نام یا مسیر فایل برنامه پردازش جدید، نام پردازش جدید، لیست شناسه‌ها برای پردازش جدید، و در بعضی حالت‌ها، مجموعه‌ای از متغیرهای محیط، فراخوانی می‌کند. از این قرار:

      ssh کرانه‌های کلمات مرا می‌خورد! نمی‌توانم ‎ ssh remotehost make CFLAGS="-g -O"‎ را انجام بدهم!

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

      چطور می‌توانم تعیین کنم که یک پیوند نمادین منفصل (شکسته) است؟

      مستندات در این مورد مبهم است، اما می‌توانید به نوعی با دستورات داخلی پوسته آن را انجام دهید:

      چگونه پشتیبانی محلی را به اسکریپت‌های bash اضافه می‌کنید؟

      جستجوی مثالهای چگونگی افزایش محلی‌سازی ساده اسکریپت‌های bash، وچگونکی بررسی آن؟ احتمالاً آنچه شما می‌خواهید این است....

      چطور می‌توانم جدیدترین(یا قدیمی‌ترین) فایل یک شاخه را به دست آورم؟

      پاسخ ‎ls -t | head -1‎ که فوراً به ذهن می‌رسد، اشتباه است، به علت آنکه تجزیه خروجی ls نا امن است، در عوض، باید حلقه‌ای ایجاد نموده و نشانه‌های زمان را مقایسه کنید:

      در bash چگونه می‌توانم رشته‌ها را دستکاری کنم؟

      Bash می‌تواند عملیات با رشته‌ها را انجام دهد. عملیات رشته‌ای فراوان. این یک مقدمه برای دستکاری‌های رشته در bash و شگردهای مربوطه می‌باشد. با پرسش‌های بسط پارامتر همپوشانی دارد، اما اطلاعاتی که در اینجا ارائه شده است، یک حالت مبتدی پسندتری دارد(امیدواریم).

      توابع سودمند عمومی(warn و die)

      (اگر شما در جستجوی گزینه پردازش بوده‌اید، پرسش BashFAQ/035 را ملاحظه کنید.) در مورد توابع ذیل بارها در ‎ #bash‎ سؤال شده است، بنابراین امیدواریم آنها برایتان مفید باشد.

      چگونه اختلاف بین دو تاریخ را به دست آورم؟

      بهترین کار آنست که در سراسر کُد خود با نشانه‌های زمان (timestamps) کار کنید، و سپس برای خروجی، این نشانه‌ها را به شکل قابل خواندن انسانی تبدیل نمایید. اگر شما با ورودی قابل خواندن انسانی سر و کار دارید، پس به چیزی که بتواند آنها را تجزیه کند نیاز دارید.

      چطور بررسی نمایم که فایل دریک ماه معین یا در یک محدوده تاریخی ویرایش شده است؟

      انجام محاسبات مبتنی بر تاریخ در Bash دشوار است، زیرا Bash ساختار داخلی برای محاسبه با تاریخ یا دریافت فوق داده‌هایی مانند زمان ویرایش فایلها ندارد.

      چرا ‎ foo=bar echo "$foo"‎ رشته bar را چاپ نمی‌کند؟

      این تله است، و باید به ترتیب دقیقی توجه شود که، تفکیک کنندهBash هر مرحله را انجام می‌دهد.

      چرا ‎ set -e‎(یا ‎ set -o errexit‎ یا‎ trap ERR‎) آنچه را انتظار دارم انجام نمی‌دهد؟

      دستور ‎set -e‎ کوششی برای افزودن تشخیص خطای خودکار به پوسته بود. هدف آن بود که موجب گردد هرگاه هر خطایی رخ داد، پوسته لغو بشود، بنابراین شما نباید‎ || exit 1‎ را بعد از هر دستور مهم قرار بدهید.

      می‌خواهم از داخل اسکریپت stdout را به یک فایل ثبت وقایع tee نمایم. و شاید stderr را به همچنین.

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

      چگونه به هر سطر یک جریان مُهرتاریخ بزنم؟

      روشهای بیشماری برای انجام این کار هست، اما تمام آنها یا به ابزارهای در دسترس محدود می‌شوند، یا کند هستند. ما چند نمونه را نشان خواهیم داد.

      چطور در انتظار انجام چند پردازش فرزند بمانم؟

      برای انجام این کار روشهای بیشماری موجود است، اما تمام آنها محدود به ابزارهای در دسترس هستند. من به چاره کار‌های زیر رسیدم .

      چگونه می‌توانم بگویم که اسکریپت من آیا منبع شده(به طور نقطه‌ای) یا اجرا گردیده است؟

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

      آیا می‌توانم چیزی مشابه الگوها(templates) را با bash به کار ببرم؟

      Bashهیچ روش درونی برای استفاده از قالب ها( templates) ندارد.

      پرسش و پاسخ‌های Bash (آخرین ویرایش ‎2010-10-26 16:22:21‎ توسط GreyCat)

      نظرات 0 + ارسال نظر
      ایمیل شما بعد از ثبت نمایش داده نخواهد شد