فرقی نمیکند تازهکار باشید یا حرفهای کار با ترمینال را بلد باشید؛ همیشه ترفندهای کوچکی وجود دارد که میتوان یاد گرفت و در زمان صرفهجویی کرد. سه ترفند مفید Bash در ادامه معرفی میشود که میتوان به جعبهابزار خود اضافه کرد.
جایگزینی پردازش (Process Substitution) برای تبدیل داده به فایل موقت
گاهی پیش میآید که برنامهای نیاز به مسیر یک فایل بهعنوان ورودی دارد، اما تنها داده در اختیار است.
بهعنوان مثال، فرض کنید میخواهید متنی را که همین حالا در ترمینال دارید ویرایش کنید:
echo "foo" | nano
این دستور کار نمیکند، زیرا نمیتوان داده را به صورت pipe به nano ارسال کرد؛ بلکه باید مسیر یک فایل را بدهید:
nano /path/to/file.txt
برای حل این مشکل معمولاً از دو دستور متوالی استفاده میشود:
echo foo > bar.txt
nano bar.txt
در این روش ابتدا فایل ساخته میشود و سپس با آن کاری انجام میگیرد. این روش بهینه نیست زیرا باعث پراکندگی فایلهای موقت در سیستم میشود و نیاز به تایپ مسیر دارد. جایگزینی پردازش این مشکل را حل میکند:
echo <(true)
اجرای دستور بالا یک مسیر مانند زیر برمیگرداند:
/dev/fd/16
جایگزینی پردازش یک فایل موقت از خروجی یک دستور تولید میکند تا دستور دیگری بتواند از آن بخواند. در این مثال، <(true) مسیر فایل را ایجاد میکند و echo آن را نمایش میدهد. محتوای داده همان خروجی دستور true است.
بخش fd به عبارت File Descriptor اشاره دارد، که شناسهای است که برنامهها برای اشاره به فایلهای بازشده استفاده میکنند. در اینجا شناسه فایل ۱۶ است. این شناسهها خصوصی هستند و تنها برای همان پردازش قابل استفادهاند.
یک مثال کاربردی از این قابلیت:
nano <(echo "foo")
این دستور معادل موارد زیر است:
echo "foo" > /tmp/foo
nano /tmp/foo
در این روش فایل ایجادشده فقط خواندنی است، بنابراین نمیتوان تغییرات را در همان فایل ذخیره کرد، اما میتوان با فشردن Ctrl+o مسیر جدیدی برای ذخیره انتخاب کرد.
جایگزینی پردازش ورودی و خروجی
عبارت <(foo) یک جایگزینی پردازش ورودی ایجاد میکند. نوع دیگری هم وجود دارد که جایگزینی پردازش خروجی است:
echo "foo" > >(cat)
این معادل است با:
echo "foo" > /tmp/foo
cat /tmp/foo
در واقع echo "foo" داده را به یک فایل ویژه مینویسد و cat همان فایل را میخواند.
بهطور خلاصه:
echo <(true)یک جایگزینی پردازش ورودی است و داده را از مسیر خاصی دریافت میکند.echo "foo" > >(cat)یک جایگزینی پردازش خروجی است و دستورcatداده را از مسیر ویژه میخواند.
یک نمونه واقعی از این کاربرد:
diff <(ls -1 ~) <(ls -1 /tmp)
این دستور تفاوت محتوای دو پوشه را مقایسه میکند. دستور diff انتظار مسیر فایل دارد و جایگزینی پردازش همان را فراهم میکند.
نکته: -۱ در دستور ls -1 عدد یک است، نه حرف L کوچک.
گسترش تاریخچه (History Expansion) برای اجرای مجدد دستورات
در Bash عبارت گسترش (expansion) به معنای تبدیل چیزی کوچک به چیزی کاملتر است. نمونه معروف آن گسترش ~ است که مسیر دایرکتوری خانه را برمیگرداند.
سه روش زیر گسترش تاریخچه هستند که ورودی کوتاه را به دستورات ذخیرهشده در تاریخچه ترمینال گسترش میدهند.
!!
این یکی از پرکاربردترین دستورات است و آخرین دستور اجراشده را دوباره اجرا میکند:
ls
!!
در خروجی دیده میشود که دستور ls دوبار اجرا شده است.
!N
برای اجرای مجدد دستور خاصی از تاریخچه:
history
!۲۳
عدد سمت چپ خروجی دستور history را انتخاب کنید. قبل از اجرا حتماً بررسی کنید تا اشتباهاً دستور خطرناک اجرا نشود.
!نام
برای جستجوی سریعتر در تاریخچه، میتوان ابتدای نام دستور را تایپ کرد تا آخرین دستور مطابق آن اجرا شود:
echo foo
!e
!ech
این روش برای سوییچ سریع بین چند دستور در یک جلسه ترمینال بسیار کاربردی است.
گروهبندی دستورات (Command Groups)
گاهی لازم است چند دستور پشت سر هم اجرا شود ولی خروجی آنها بهصورت یک نتیجه واحد پردازش شود. مثال ساده:
echo foo > /tmp/foo.txt
echo bar >> /tmp/foo.txt
فایل ایجادشده شامل:
foo
bar
میشود. برای سادهتر کردن این فرآیند میتوان از گروه دستورات استفاده کرد:
{ echo foo; echo bar; } > /tmp/foo.txt
تمام خروجیهای داخل آکولاد بهعنوان یک جریان واحد ارسال میشوند. نکته مهم: بعد از هر دستور باید ; قرار گیرد و فاصله قبل و بعد از { و } الزامی است.
نمونه کاربردی:
{ ping -c 1 example.com; ping -c 1 example.net; } > /tmp/ping.txt
جمعبندی
- جایگزینی پردازش: خروجی یک دستور را به فایل موقت تبدیل میکند، مانند:
nano <(echo "foo")
echo "foo" > >(cat)
- گسترش تاریخچه: اجرای مجدد دستورات ذخیرهشده با کاراکترهای خاص، مانند
!!یا!N. - گروهبندی دستورات: اجرای چند دستور و ترکیب خروجی آنها به یک نتیجه واحد، مانند:
{ echo "foo"; echo "bar"; } > /tmp/foo.txt
این موارد تنها بخش کوچکی از قابلیتهای Bash هستند. اگر این ترفندها مفید به نظر میرسند، یادگیری دستور history و سایر ابزارهای خط فرمان توصیه میشود تا کار با ترمینال سریعتر و سادهتر شود.












