رنامه در لینوکس با سه جریان ورودی و خروجی اصلی تعامل دارد:
ورودی استاندارد (stdin) – بهطور پیشفرض، ورودی را از صفحهکلید دریافت میکند.
خروجی استاندارد (stdout) – نتیجه اجرای برنامه را روی صفحه نمایش نشان میدهد مگر اینکه تغییر مسیر داده شود.
خطای استاندارد (stderr) – پیامهای خطا و وضعیت را جدا از خروجی استاندارد نمایش میدهد.
شناخت این جریانها به کاربران اجازه میدهد ورودی و خروجی را تغییر مسیر دهند و بهطور کارآمد مدیریت I/O را در لینوکس انجام دهند.
تغییر مسیر خروجی استاندارد (stdout)
بهطور پیشفرض، خروجی دستورات روی صفحه نمایش نمایش داده میشود، اما میتوان آن را به یک فایل هدایت کرد با استفاده از >:
ls -l /usr/bin > ls-output.txt
این دستور محتویات دایرکتوری /usr/bin را در فایل ls-output.txt ذخیره میکند به جای نمایش آن در ترمینال.
بررسی فایل خروجی
ls -l ls-output.txt
اگر موفقیتآمیز باشد، فایل شامل خروجی دستور خواهد بود. برای مشاهده محتویات فایل:
less ls-output.txt
مدیریت خطاها با خطای استاندارد (stderr)
همه خروجیها خروجی استاندارد (stdout) نیستند. بسیاری از برنامهها پیامهای خطا را به stderr ارسال میکنند، بنابراین اگر خروجی را تغییر مسیر داده باشیم، خطاها همچنان در صفحه نمایش نشان داده میشوند.
مثال: تغییر مسیر خروجی با یک دایرکتوری نامعتبر
ls -l /bin/usr > ls-output.txt
اگر /bin/usr وجود نداشته باشد، پیام خطا روی صفحه نمایش ظاهر میشود و نه در ls-output.txt. برای بررسی اندازه فایل:
ls -l ls-output.txt
خروجی نشان میدهد:
bash
-rw-rw-r-- 1 user user 0 ls-output.txt
فایل خالی است زیرا stdout تغییر مسیر داده شد ولی stderr همچنان روی صفحه نمایش بود.
افزودن خروجی به جای جایگزینی فایل
بهطور پیشفرض، > فایلهای موجود را بازنویسی میکند. اگر بخواهیم خروجی را اضافه کنیم به جای جایگزینی محتویات، از >> استفاده میکنیم:
ls -l /usr/bin >> ls-output.txt
با استفاده از >> خروجی به فایل افزوده میشود بدون حذف دادههای قبلی.
مثال: افزودن خروجی چندین بار
ls -l /usr/bin >> ls-output.txt ls -l /usr/bin >> ls-output.txt ls -l /usr/bin >> ls-output.txt ls -l ls-output.txt
اکنون، فایل ls-output.txt پس از هر اجرا بزرگتر میشود.
شناخت stdin، stdout، و stderr به کاربران لینوکس اجازه میدهد خروجی را تغییر مسیر دهند، خطاها را ضبط کنند و رفتار ذخیره فایل را کنترل کنند
در لینوکس، دستورات خروجی اصلی خود را به خروجی استاندارد (stdout) ارسال میکنند و پیامهای خطا را به خطای استاندارد (stderr) میفرستند. بهطور پیشفرض، هر دو جریان روی صفحه نمایش نشان داده میشوند، اما کاربران میتوانند مسیر آنها را تغییر دهند یا به فایل خاصی هدایت کنند.
این مقاله نحوه تغییر مسیر خطای استاندارد (stderr)، ترکیب جریانها در یک فایل، و حذف خروجیهای ناخواسته با استفاده از /dev/null را بررسی میکند.
تغییر مسیر خطای استاندارد (stderr)
از آنجا که stderr شماره شناسایی فایل 2 را دارد، برای تغییر مسیر پیامهای خطا از 2> استفاده میکنیم:
ls -l /bin/usr 2> ls-error.txt
این دستور فقط پیامهای خطا را به ls-error.txt ارسال میکند، در حالی که stdout همچنان روی صفحه نمایش باقی میماند.
ترکیب خروجی استاندارد (stdout) و خطای استاندارد (stderr) در یک فایل
گاهی کاربران میخواهند تمام خروجیهای یک دستور را در یک فایل ذخیره کنند. برای این کار، دو روش وجود دارد:
روش سنتی (سازگار با نسخههای قدیمی شل)
ls -l /bin/usr > ls-output.txt 2>&1
توضیح:
stdout به ls-output.txt تغییر مسیر داده میشود.
stderr (فایل شماره 2) به stdout (فایل شماره 1) با استفاده از 2>&1 هدایت میشود.
روش جدید در Bash (سینتکس سادهتر)
ls -l /bin/usr &> ls-output.txt
با &>، هر دو جریان در یک فایل ترکیب میشوند، بدون نیاز به 2>&1.
افزودن خروجی به جای جایگزینی فایل
برای افزودن خروجی به فایل موجود به جای بازنویسی محتویات از >> استفاده میکنیم:
ls -l /bin/usr &>> ls-output.txt
اکنون، هر اجرا به خروجی فایل اضافه میشود بدون حذف دادههای قبلی.
حذف خروجیهای ناخواسته با /dev/null
گاهی نیاز داریم پیامهای خطا را حذف کنیم بدون ذخیره آنها. بهترین روش هدایت خروجیهای نامطلوب به /dev/null است که به عنوان سطل بیت (bit bucket) شناخته میشود:
ls -l /bin/usr 2> /dev/null
در اینجا، تمام پیامهای خطا حذف میشوند و هیچ اطلاعاتی ذخیره نمیشود.
فرهنگ یونیکس: /dev/null
سطل بیت (/dev/null) یک مفهوم قدیمی در یونیکس است که برای حذف کامل دادهها استفاده میشود. در جوامع فناوری، اگر کسی بگوید "درخواست شما به /dev/null ارسال شد" بهطور طنزآمیز یعنی کاملاً نادیده گرفته شده است.
ورودی استاندارد (stdin) یکی از سه جریان اصلی ورودی/خروجی در لینوکس است. این جریان به برنامهها اجازه میدهد ورودی دریافت کنند، که بهطور پیشفرض از صفحهکلید میآید، اما میتوان آن را از فایلها یا منابع دیگر تغییر مسیر داد.
این مقاله نحوه تغییر مسیر ورودی استاندارد را با استفاده از دستور cat بررسی کرده و توضیح میدهد که چگونه تغییر مسیر ورودی باعث بهینهسازی پردازش متن در لینوکس میشود.
استفاده از cat برای خواندن فایلها
دستور cat محتویات یک فایل را در خروجی استاندارد (stdout) کپی میکند:
cat filename
برای مثال، نمایش محتویات ls-output.txt:
cat ls-output.txt
این دستور فایل را بدون صفحهبندی نمایش میدهد.
ترکیب چندین فایل با cat
اگر یک فایل بزرگ به چندین قسمت تقسیم شده باشد، میتوان با cat آنها را دوباره به هم متصل کرد:
cat movie.mpeg.0* > movie.mpeg
از آنجا که کاراکترهای جایگزین (wildcards) فایلها را بهترتیب مرتب میکنند، قسمتها بهدرستی ترکیب میشوند.
استفاده از cat با ورودی استاندارد (stdin)
وقتی cat بدون آرگومان اجرا شود، منتظر ورودی از صفحهکلید میماند:
cat
این دستور مانند یک پنجره ورودی تعاملی عمل میکند که به کاربران اجازه میدهد متن تایپ کنند.
اتمام ورودی با Ctrl+D
برای مشخص کردن پایان ورودی (EOF)، کلید Ctrl+D را فشار دهید:
cat The quick brown fox jumped over the lazy dog.
پس از زدن Ctrl+D، متن وارد شده نمایش داده میشود.
ایجاد یک فایل با تغییر مسیر ورودی
عملگر > کاربران را قادر میسازد ورودی استاندارد را در یک فایل ذخیره کنند:
cat > lazy_dog.txt The quick brown fox jumped over the lazy dog.
این دستور متن را در lazy_dog.txt ذخیره میکند.
بررسی محتویات فایل
برای تأیید اطلاعات ذخیرهشده:
cat lazy_dog.txt
خروجی:
bash
The quick brown fox jumped over the lazy dog.
تغییر مسیر ورودی استاندارد (<) از یک فایل
بهجای تایپ دستی متن، کاربران میتوانند یک فایل را بهعنوان ورودی هدایت کنند:
cat < lazy_dog.txt
این دستور فایل lazy_dog.txt را میخواند و دقیقاً مانند ارسال آن بهعنوان آرگومان عمل میکند. اگرچه این روش برای cat چندان مفید نیست، اما دستورات دیگر از تغییر مسیر ورودی بهشکل مؤثرتری استفاده میکنند.
پایپلاینها در لینوکس امکان پردازش داده بهصورت پویا را فراهم میکنند. این قابلیت خروجی استاندارد (stdout) یک دستور را به ورودی استاندارد (stdin) دستور دیگر متصل میکند و با استفاده از عملگر | اجرا میشود. با زنجیره کردن چندین دستور، کاربران میتوانند دادهها را فیلتر، مرتبسازی و تحلیل کنند.
این مقاله نحوه استفاده از پایپلاینها، اعمال فیلترهایی مانند sort، uniq، grep و استفاده از tee برای ذخیره خروجی پایپلاین را بررسی میکند.
استفادهی اولیه از پایپ (|)
یک پایپ خروجی یک دستور را به ورودی دستور دیگر متصل میکند:
command1 | command2
مثال: نمایش خروجی صفحهبندیشده با less:
ls -l /usr/bin | less
اینجا، ls -l /usr/bin فایلها را لیست میکند و less اجازه میدهد نتایج را بهصورت صفحهبندی مشاهده کنیم.
مرتبسازی خروجی با sort
برای لیست کردن تمام برنامههای اجرایی در /bin و /usr/bin، مرتبسازی آنها و نمایش نتایج:
ls /bin /usr/bin | sort | less
با sort، خروجی بهصورت یک لیست مرتبشده ترکیب میشود.
تفاوت > و |
درحالیکه > خروجی را در یک فایل ذخیره میکند، | خروجی را به یک دستور دیگر هدایت میکند:
ls > output.txt # هدایت خروجی به فایل ls | less # هدایت خروجی به less
استفادهی نادرست از > ممکن است فایلهای سیستمی را بازنویسی کند و باعث مشکلات جدی شود.
حذف موارد تکراری با uniq
uniq ورودیهای تکراری را بعد از مرتبسازی (sort) حذف میکند:
ls /bin /usr/bin | sort | uniq | less
برای مشاهدهی فقط موارد تکراری از -d استفاده کنید:
ls /bin /usr/bin | sort | uniq -d | less
شمارش تعداد خطوط خروجی با wc
برای شمارش تعداد آیتمها در یک لیست مرتبشده از wc -l استفاده کنید:
ls /bin /usr/bin | sort | uniq | wc -l
خروجی:
bash
2728
این عدد ۲۷۲۸ آیتم منحصربهفرد در دایرکتوریهای مشخصشده را نشان میدهد.
جستجوی الگوهای متنی با grep
grep الگوهای خاصی را در متن پیدا میکند. مثال: لیست کردن ابزارهای مرتبط با فشردهسازی با استفاده از zip:
ls /bin /usr/bin | sort | uniq | grep zip
نتایج:
bash
bunzip2
bzip2
gunzip
gzip
unzip
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit
گزینههای مفید grep:
-i – نادیده گرفتن حساسیت حروف.
-v – نمایش خطوطی که با الگو مطابقت ندارند.
نمایش چند خط اول یا آخر با head و tail
head چند خط اول را نمایش میدهد؛ tail چند خط آخر را نمایش میدهد:
head -n 5 ls-output.txt tail -n 5 ls-output.txt
مفید در پایپلاینها:
ls /usr/bin | tail -n 5
مثال مانیتورینگ فایلهای لاگ در لحظه با tail -f:
tail -f /var/log/messages
برای توقف نمایش، کلید Ctrl+C را فشار دهید.
ذخیره خروجی پایپلاین با tee
tee اجازه میدهد دادههای پایپلاین ذخیره شوند بدون قطع جریان دادهها:
ls /usr/bin | tee ls.txt | grep zip
اکنون، ls.txt لیست کامل را ذخیره کرده، درحالیکه grep zip نتایج مرتبط را نمایش میدهد.