pipes, redirection and xargs در لینوکس
مصطفی ستاری | چهارشنبه, ۱ مرداد ۱۳۹۳، ۰۹:۰۵ ق.ظ |
۰ نظر
ریدارکشن برای ارسال خروجی به یک فایل یا استریم استفاده میشه. (ریدایرکت کردن stdout یا stderr)
اگر بخواهیم خروجی thing1 را به thing2 ارسال کنیم دستور به شکل زیر خواهد شد:
پایپ برای ارسال خروجی یک برنامه به یک برنامه دیگر استفاده میشه. (میشه از اون عنوان شکل خاص ریدایرکشن یاد کرد)
xargs میاد خروجی رو به صورت استریم (یا فایل) میخونه و به صورت آرگومان به برنامهای که بهش میدیم پاس میده.
مثلا
مثال زیر بهتر این نکته رو نشون میده:
اطلاعات بیشتر [+، +، +، +، +]
$ 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شماره فایل (یا بهتر بخوایم بگیم file descriptor) برای stdin=0 برای stdout=1 و برای stderr=2 هست و میتونیم خروجی هر کدوم رو به یک جایی ریدایرکت کنیم. مثلا:
1 2
3 4
$ 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
.
مثال زیر بهتر این نکته رو نشون میده:
$ 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
اطلاعات بیشتر [+، +، +، +، +]