ترجمه راهنمای BashGuide به پایان رسید، و در ضمن به صورت یک فایل pdf نیز فراهم گردیده، که قابل دریافت میباشد، اما همانگونه که قبلاً اشاره شد، این راهنما بخشی از یک Wiki است، که گستردهتر از این راهنما میباشد.
در شروع ترجمه این راهنما به صورت یادداشتهای ادامهدار، نوشتم که پس از تکمیل ترجمه راهنما احتمالاً به ترجمه سایر بخشها خواهم پرداخت. اکنون زمان اجرای آن تعهد ضمنی فرا رسیده است، و من برای ادامه، بخش «پرسش و پاسخهای رایج Bash» از این Wiki را انتخاب نمودهام که به همان روال سابق به صورت یاداشتهای متوالی در اینجا قرار خواهم داد.
سعی خواهد شد در هر یادداشت یک پرسش و پاسخ به طور کامل ارایه شود، مگر در مواردی که پاسخ خیلی طولانی و خارج از حوصله یک یاداشت باشد، که البته مواردی اینچنین نیز وجود دارد.
اکنون در ادامه، فهرست پرسش و پاسخها را ملاحظه مینمایید.
من ترجیح میدهم پرسش و پاسخها را به ترتیب ارائه نمایم زیرا نگاه من به این ترجمهها بیشتر یک نگاه بلندمدت است، نه رفع نیاز فوری، بنابراین چنین عمل خواهم نمود، مگر آنکه درخواستهای چندگانهای برای خارج از نوبت قرار دادن برخی از پرسشها وجود داشته باشد.
|
اینها پاسخهایی هستند به پرسشهایی که به طور مکرر درکانال #bash روی IRC شبکه freenode مطرح گردیدهاند. این پاسخها با همکاری اعضای ثابت کانال(originally heiner، و سپس دیگران شامل greycat و r00t)، و کاربرانی مانند شما، تنظیم شدهاند. اگر شما مورد غیردقیق یا واقعاً ناصحیحی یافتید، با خیال راحت آنرا اصلاح کنید!
تمام اطلاعات موجود در اینجا بدون ضمانت و تضمین صحت میباشد. با مسئولیت خودتان به کار ببرید. وقتی تردید دارید، لطفاً صفحات man یا info گنو را به عنوان منابع تصدیقشده، کاوش کنید.
BASH پوسته سازگار با BourneShell است، که ویژگیهای بسیاری به نیای خود افزوده است. اکثر آنها در KornShell، نیز معتبر هستند. جوابهای ارائه شده در این پرسش و پاسخها ممکن است به طرف Bash یا کوچکترین مخرج مشترک پوسته بورن گرایش داشته باشند، نسبت به آن که چه کسی آن پاسخ را نوشته باشد. در اکثر حالتها، کوششی برای ارائه هردو پاسخ، قابل حمل(بورن)، و کارآمد(Bash، در جای مقتضی) به عمل آمده است. اگر پرسشی به طور دقیق مخصوص پوسته نیست، اماتا اندازهای مربوط به یونیکس است، شاید پاسخ آن در UnixFaq باشد.
این پرسش و پاسخ سطح معینی از آشنایی با دستور زبان اسکریپتنویسی شل رافرض مینماید. اگر شما به طور کامل در Bash یا پوستههای خانواده Bourne تازهوارد میباشید، شاید مایل باشید با BashGuide شروع به یادگیری نمایید.
اگر نمیتوانید پاسخ پرسشی که در جستجوی آن هستید را در اینجا پیدا کنید، BashPitfalls را بررسی نمایید. اگر میخواهید کمک کنید، میتوانید به یک پرسش جدید در اینجا پاسخ بدهید، یاجوابگویی به یکی ازاینها( BashOpenQuestions) را امتحان کنید.
Bash FAQ رسمی Chet Ramey تکنیکهای بسیاری دارد که در اینجا پوشش داده نشدهاند.
◯ فهرست
- چطور میتوانم یک فایل(جریان داده، متغیر) را سطر به سطر بخوانم(و یا فیلد به فیلد)؟
- چگونه میتوانم مقدار برگشتی یا خروجی دستوری را در یک متغیر ذخیره نمایم؟
- چطور میتوانم آخرین(جدیدترین، قدیمیترین، مسنترین) فایل در یک دایرکتوری را پیدا کنم؟
-
چگونه بررسی نمایم که آیا یک شاخه، خالی است یا خیر؟ چطور هر فایل
* .mpg را بررسی کنم، یا تعداد آنها را شمارش کنم؟ - چگونه می توانم از متغیرهای آرایهای استفاده کنم؟
- چطور میتوانم از متغیرهای بیثبات(متغیرهای غیر مستقیم، اشارهگرها، مرجعها) یا آرایههای شرکتپذیر استفاده کنم؟
- آیا تابعی وجود دارد که طول یک رشته را بازگرداند؟
- چگونه میتوانم تمام فایلها را به طور بازگشتی برای یک رشته جستجو نمایم؟
-
میانگیری(buffering) چیست؟ یا، چرا این سطر فرمان من خروجی ندارد: tail
-f logfile | grep \'foo bar\'| awk ... - چطور میتوانم یک ساختار دایرکتوری سلسله مراتبی بدون فایل ایجاد نمایم؟
- چگونه میتوانم سطر شماره n از یک فایل را چاپ کنم؟
- به چه طریق میتوانم یک فرمان شل را از یک برنامه غیرپوستهای فراخوانی نمایم؟
- چگونه میتوانم دو متغیر را به هم الحاق کنم؟ چگونه یک رشته را در یک متغیر اضافه(پیوست) کنم؟
- چطور میتوانم چند دستور را در یک مرحله تغییر مسیر بدهم؟
- چگونه میتوانم یک دستور را با تمام فایلهای دارای پسوند .gz اجرا کنم؟
- چگونه میتوانم از AND/OR/NOT منطقی در الگو(جانشین) پوسته استفاده کنم؟
- چگونه میتوانم عبارتها را گروهبندی کنم، مثل (a AND b) OR c؟
- چگونه میتوانم از اعدادی که با صفر شروع میشوند مثل 01 و 02 در یک حلقه استفاده کنم؟
- به کدام طریقه میتوانم یک فایل را به محدودههایی از سطرها، مانند سطرهای 1-10، 11-20، 21-30 تجزیه کنم؟
- چطور میتوانم نام فایلهای شامل کاراکتر فاصله یا سطر جدید یا هر دو را پیدا کرده وبا آنها کار کنم؟
- چگونه میتوانم یک رشته را با رشته دیگری در یک متغیر، جریان داده، یک فایل، یاتمام فایلهای یک شاخه، تعویض نمایم؟
- چگونه میتوانم به جای فقط اعداد صحیح، اعداد با ممیز شناور را در محاسبه استفاده کنم؟
-
من میخواهم به پوسته محاورهای که مستعارها و توابع ویژهای دارد، نه آنها که در
~ /.bashrc کاربر هست، متصل شوم. - من متغیرهایی را در حلقه تنظیم میکنم. چرا به طور ناگهانی پس از اتمام حلقه آنها ناپدید میشوند؟ یا، چرا نمیتوانم داده را برای خواندن لولهکشی کنم؟
-
چطور میتوانم پارامترهای موضعی(مکانی) بعد از
$ 9 را دستیابی کنم - از چه طریق میتوانم ترتیب سطرهای فایلی را تصادفی نمایم(بُر زدن)؟(یا یک سطر اتفاقی از فایل را انتخاب کنم، یا انتخاب یک فایل به طور تصادفی از یک شاخه.)
- چطور میتوان دو پردازش جداگانه را به هم ارتباط داد؟
- چگونه میتوانم محل اسکریپت خود را تعیین کنم؟ میخواهم فایلهای پیکربندی را از همان محل بخوانم.
- به چه طریق میتوانم مقصد یک پیوند نمادین را نمایش بدهم؟
- چگونه میتوانم تمام فایلهای *.foo را به *.bar تبدیل نمایم، یا فاصلهها را به خط زیر تبدیل کنم، و یا حروف بزرگ نام فایلها را به حروف کوچک تبدیل کنم؟
-
تفاوت بین test و [ و
[[ چیست؟ - چطور میتوانم خروجی \'time\' را به یک متغیر یا فایل تغییر مسیر بدهم؟
- چگونه میتوانم شماره شناسایی پردازشی با دادن نام آن پردازش به دست آورم؟
- آیا میتوانم در Bash یک چرخنده اجرا کنم؟
- چگونه میتوانم شناسههای( گزینههای ) خطفرمان را به آسانی مدیریت کنم؟
- چطور میتوانم تمام سطرهایی را به دست آورم که: در هر دو فایل هستند(فصل مشترک) یا فقط در یکی از دوفایل میباشند(تفاوتها).
- چطور میتوانم متن را با رنگهای مختلف چاپ کنم؟
- مجوزهای فایل در یونیکس چگونه کار میکنند؟
- تمام فایلهای نقطهای که bash میخواند کدام هستند؟
- چگونه میتوانم از dialog برای دریافت ورودی کاربر استفاده کنم؟
- چطور میتوانم تعیین نمایم که آیا یک متغیر شامل یک زیر رشته هست؟
- چگونه میتوانم دریابم که یک پردازش هنوز در حال اجرا است؟
-
چرا job من در crontab ناموفق است؟
0 0 * * * some command> /var/log/mylog.`date+%Y%m%d ` - چطور میتوانم نوار پیشروی ایجاد کنم؟ چگونه میتوانم موقع کپی یا انتقال فایلها، نمایشگر پیشروی را ببینم؟
- به چه طریق میتوانم مطمئن شوم که فقط یک نمونه از اسکریپت در یک زمان معین در حال اجرا است(ممانعت دوطرفه)؟
- میخواهم بررسی کنم که آیایک کلمه در یک لیست وجود دارد( یایک عنصر عضوی از یک مجموعه هست).
- چطور میتوانم stderr را به یک لوله تغییر مسیر بدهم؟
- فرمان eval و مسائل امنیت
- چگونه میتوانم به روزرسانیهای دورهای یا پیوست کردنها به یک فایل راببینم؟(مثل: رشد فایل log )
- من سعی دارم دستوری را در یک متغیر قرار بدهم، اما موارد پیچیده همیشه ناموفق است!
- من جستجوی تاریخچه درست مانند آن در tcsh میخواهم. چطور میتوانم آن را به کلیدهای up و down مربوط کنم؟
- چطور میتوانم یک فایل را از فرمت DOS به فرمت UNIX تبدیل کنم( CRها را از CR-LF خاتمه دهنده سطرها حذف کنم)؟
- من یک اعلان فرمان تفننی رنگی دارم، اما حالا به نظر نمیرسد bash بداند پهنای ترمینال من چقدر است. سطرها به طور نادرستی شکسته میشوند.
- چگونه میتوانم بگویم که یک متغیر آیا محتوی یک عدد معتبر هست؟
-
به طور کلی در باره
2 >& 1 بگویید -- تفاوت بین 2 >& 1 > foo و > foo 2 >& 1 چیست، و چهوقت میتوانم از هرکدام استفاده کنم؟ - چطور میتوانم چند فایل را به طور یکجا untar (یا unzip) نمایم؟
- چطور میتوانم اقلام را گروهبندی نمایم(در یک فایل با پیشوندهای مشترک)؟
- آیا bash میتواند دادههای باینری را اداره کند؟
-
من این دستور را در جایی دیدم:
:() (بمب خوشهای). این چطور کار میکند؟{ :|:&} - من سعی میکنم اسکریپتی بنویسم که دایرکتوری جاری را تغییر دهد( یا یک متغیر را تنظیم کند)، اما بعد از به پایان رسیدن اسکریپت، در همان جایی هستم که از آنجا شروع کرده بودم(یا متغیر من نیست)!
- آیا لیستی از ویژگیهای اضافه شده به یک نگارش معین Bash وجود دارد؟
- چطور میتوانم در یک حالت ایمِن، یک فایل موقتی ایجاد کنم؟
- وقتی من میخواهم بعد از اجرای یک job پسزمینهای راه دور قطع ارتباط کنم، سرویسگیرنده ssh من هنگ میکند !
- چرا دریافت پاسخ پرسشی که من در #bash پرسیدم، تا این اندازه دشوار است؟
- آیا یک دستور "PAUSE" مانند آن که در اسکریپتهای MSDOS هست، در bash وجود دارد؟ که به کاربر اعلام نماید جهت ادامه کلیدی را بزند؟
-
میخواهم بدون n مرتبه تکرار
$ var ، عبارت $ more ... یا var ==$ bar یا if [[var ==$ foo را بررسی کنم.var == - چطور میتوانم فضای سفید قبل یا بعد یکی از متغیرهایم را پاک کنم؟
- چگونه میتوانم فرمانی را اجرا کنم و انصراف از آن پس از N ثانیه را داشته باشم(timeout)؟
- میخواهم یک ارتباط ssh (یا scp، یا sftp) را خودکار نمایم، اما نمیدانم چطور کلمه عبور را ارسال کنم
- چطور میتوانم زمان یونیکس(epoch) را به مقادیر قابل خوندن انسانی تبدیل نمایم؟
- چطور میتوانم یک کاراکتر اسکی را به مقدار دسیمال(یا هگزادسیمال) آن و برعکس تبدیل نمایم؟
- چگونه میتوانم مطمئن شوم که محیط من برای برنامههای cron، batch، و jobs پیکربندی شده است؟
- چگونه میتوانم از بسط پارامتر استفاده کنم؟ چطور زیر رشتهها را ایجاد کنم؟ چگونه میتوانم نام فایل را بدون پسوند کنم، یا فقط پسوند فایلها را به دست آورم؟
- چگونه میتوانم اثرات بسط پارامترهای جالب Bash را درپوستههای قدیمیتر داشته باشم؟
- چطور میتوانم از فرمان find استفاده کنم؟ من به هیچ وجه نمیتوانم صفحه man را درک کنم!
- چگونه میتوانم حاصل جمع تمام اعداد در یک ستون را به دست آورم؟
- از چه طریق میتوانم تاریخچه را در فایل log ثبت کنم یا bash را در برابر پاک کردن آن ایمن نمایم؟
- من میخواهم یک کلمه عبور کاربر را با استفاده ازفرمان passwd یونیکس ایجاد کنم، اما چطور آن را در اسکریپت قرار بدهم؟ ورودی استاندارد را نمیخواند!
-
چطور میتوانم grep را برای یافتن سطرهای شاملfoo
و bar همچنین fooیا bar به کار ببرم؟ یا برای فایلهای شامل fooو bar، شاید در سطرهای جداگانه؟ - چگونه میتوانم مستعاری ایجاد کنم که یک شناسه دریافت کند؟
-
چگونه میتوانم تعیین کنم که یک فرمان آیا در جایی از
PATH من وجود دارد؟ -
چرا
$(...) نسبت به `...` (نقلقول برعکس) ارجحیت دارد؟ - چگونه می توانم تعیین کنم که یک متغیر آیا قبلاً تعریف شده است؟
- چگونه یک رشته (یا عدد بلند، یا عدد منفی) از یک تابع باز گردانم؟ return فقط استفاده از اعداد 0 تا 255 را اجازه میدهد.
-
چگونه میتوان چند مرتبه در فایل
fifo بدون باز کردن مجدد آن، نوشت؟ - چگونه میتوان هنگام اجرای یک فرمان از مستعارها یا توابع صرفنظر کرد؟
-
از چه طریقی بدون استفاده از تفکیک خروجی ls
-l میتوانم مجوزها(یا سایراطلاعات) فایلی را دریافت کنم؟ - چطور میشود از فقدان هر یک از سطرهای تاریخچه اجتناب نمود؟
- من در حال خواندن سطر به سطر یک فایل, و اجرای ssh یا ffmpeg هستم، اما بعد از اولین سطر هر چیزی خورده میشود!
-
چگونه میتوانم متنی را در ابتدای یک فایل درج کنم(برعکس
>> )؟ -
من تلاش میکنم تعداد سطرها و ستونهای ترمینال خود را دریافت کنم، اما متغیرهای
COLUMNS وLINES همیشه تهی هستند - چگونه یک اسکریپت CGI بنویسم که پارامترها را بپذیرد؟
- چطور میتوانم محتویات نوار عنوان ترمینال خود را تنظیم نمایم؟
- میخواهم وقتی دیسک پُر میشود یک هشدار دریافت کنم(با تجزیه خروجی df ).
- میخواهم لیست خیلی بلند شناسهها را دریافت کنم. چطور میتوانم یک لیست بزرگ قابل توجه را پردازش نمایم؟
-
ssh کرانههای کلمات مرا میخورد! نمیتوانم ssh remotehost make
CFLAGS = "-g -O " را انجام بدهم! - چطور میتوانم تعیین کنم که یک پیوند نمادین آیا منفصل (شکسته) است؟
- چگونه پشتیبانی محلی را به اسکریپتهای bash اضافه میکنید؟
- چطور میتوانم جدیدترین(یا قدیمیترین) فایل یک شاخه را به دست آورم؟
- در bash چگونه میتوانم رشتهها را دستکاری کنم؟
- توابع سودمند عمومی(warn و die)
- چگونه اختلاف بین دو تاریخ را به دست آورم؟
- چطور بررسی نمایم که فایل دریک ماه معین یا در یک محدوده تاریخی ویرایش شده است؟
-
چرا
foo = bar echo "$ foo " رشته bar را چاپ نمیکند؟ -
چرا set
-e (یا set -o errexit یا trap ERR) آنچه را انتظار دارم انجام نمیدهد؟ -
میخواهم از داخل اسکریپت
stdout را به یک فایل ثبت وقایع tee نمایم. و شایدstderr را به همچنین. - چگونه به هر سطر یک جریان مُهرتاریخ بزنم؟
- چطور در انتظار انجام چند پردازش فرزند بمانم؟
- چگونه میتوانم بگویم که اسکریپت من آیا منبع شده(به طور نقطهای) یا اجرا گردیده است؟
- آیا میتوانم چیزی مشابه قالبها(templates) را با bash به کار ببرم؟