pipes, redirection and 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
اطلاعات بیشتر [+، +، +، +، +]