وبلاگ مصطفی ستاری

یک وبلاگ برنامه نویسی دیگر

یک وبلاگ برنامه نویسی دیگر

۱ مطلب با کلمه‌ی کلیدی «redirection» ثبت شده است

pipes, redirection and xargs در لینوکس

ریدارکشن برای ارسال خروجی به یک فایل یا استریم استفاده می‌شه. (ریدایرکت کردن stdout یا stderr)
$ thing1 > thing2
برنامه thing1 اجرا شده و خروجی اون به فایل thing2 ریدایرکت می‌شه.
اگر بخواهیم خروجی thing1 را به thing2 ارسال کنیم دستور به شکل زیر خواهد شد:
$ thing1 > tempFile && thing2 < tempFile
به جای کار بالا از پایپ استفاده می‌شه.
پایپ برای ارسال خروجی یک برنامه به یک برنامه دیگر استفاده می‌شه. (می‌شه از اون عنوان شکل خاص ریدایرکشن یاد کرد)
$ thing1 | thing2
بعضی وقتا بعضی برنامه‌ها استریم به عنوان ورودی قبول نمی‌کنند، و ما می‌خوایم خروجی یک فایل رو به صورت آرگومان بهشون بفرستیم از xargs استفاده می‌کنیم.
xargs میاد خروجی رو به صورت استریم (یا فایل) می‌خونه و به صورت آرگومان به برنامه‌ای که بهش می‌دیم پاس می‌ده.
مثلا
$ echo 1 2 3 4 | xargs echo
1 2 3 4
یا مثلا دستور زیر میگه که به ازای هر ۲ آرگومان یک دستور رو اجرا کن:
$ echo 1 2 3 4 | xargs -n 2
1 2
3 4
شماره فایل (یا بهتر بخوایم بگیم file descriptor) برای stdin=0 برای stdout=1 و برای stderr=2 هست و می‌تونیم خروجی هر کدوم رو به یک جایی ریدایرکت کنیم. مثلا:
$ echo test 1> outfile
همچنین با استفاده از &> می تونیم یک استریم رو به یک شماره فایل ریدایرکت کنیم. (به جای فایل)
$ echo something 1>&2 > outfile
و در نهایت اگر بخوایم خروجی رو هم به فایل بفرستیم و هم در صفحه نمایش نشون بدیم از tee استفاده می‌کنیم:
echo something | tee outfile
که معادل دستور زیره:
$ echo something | tee /dev/tty >> outfile
نتیجه اخلاقی:
# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

Note that that last one will not direct stderr to outfile2 - it first redirects it to what stdout was when the argument was encountered ( outfile1), and then redirects stdout to outfile2.

یعنی اینکه اول stderr رو به استریم فعلی که نقش stdout رو زمان اجرای دستور اول بازی می‌کنه، که outfile1 هست ریدایرکت می‌کنه و بعدش  stdout رو به outfile2 ریدایرکت می‌کنه. (یعنی stderr به outfile2 ریدایرکت نمی‌شه بلکه به stdout قبلی (نرمال) ریدایرکت می‌شه معمولا صفحه نمایش)
مثال زیر بهتر این نکته رو نشون می‌ده:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

اطلاعات بیشتر [+، +، +، +، +]