انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

ارائه ۲۴٫۱۰ اوبونتو منتشر شد 🎉

نویسنده موضوع: توضیح فرق گذینه های این سوال در مورد shell redirection حل شد  (دفعات بازدید: 1984 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین ali.abry

  • High Hero Member
  • *
  • ارسال: 1224
سلام دوستان
میشه لطفا در سوال زیر فرق گذینه B , C ,D رو بگین
سوال رو با عکس ضمیمه کردم
پیشاپیش ممنون
« آخرین ویرایش: 07 دی 1392، 10:06 ب‌ظ توسط ali.abry »

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
۱−به طور کلی این عبارت:
x > fileسوکت فایل شماره x را به فایل file متصل می کنه. اگر x یک باشه این سوکت stdout هست و اگر x دو باشه این سوکت stderr. اگر x قرار داده نشه پیش فرض همون x = 1 یا stdout هست.

۲− فایل /dev/null هم که مثل یک سیاه چال هست که هر چی توش بره نابود میشه  :)

۳− این عبارت هم:
x > &yسوکت فایل (file descriptor) شماره x را به جایی که در حال حاضر سوکت فایل y به آن وصل هست وصل می کنه.

توی B عبارت دومی اولی رو بی اثر می کنه و نتیجه این میشه که فقط stdout ریخته میشه تو stderr
توی D هم دومی اولی رو بی اثر می کنه و نتیجه این میشه که فقط stdout میره تو /dev/null
توی E اول stderr stream ریخته میشه تو فایل stdout بعد stdout stream ریخته میشه تو /dev/null. (یعنی stderr میشه stdout و stdout میشه null)

چند تا عکس هم ساختم از این موقعیت ها:
http://bayanbox.ir/id/579769804819727094
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین ali.abry

  • High Hero Member
  • *
  • ارسال: 1224
ممنون از پاسخ کاملوتون . گذینه ABC رو فهمیدم ولی D E رو هنوز نفهمیدم

الان گفته زیر اشتیاهه ؟

Sometimes you may want to redirect both standard output and standard error into a file.
This is often done for automated processes or background jobs so that you can review the output later.
Use &> or &>> to redirect both standard output and standard error to the same place.
Another way of doing this is to redirect file descriptor n and then redirect
 file descriptor m to the same place using the construct m>&n or m>>&n. The order in which outputs are redirected is important.
For example,
command 2>&1 >output.txt
is not the same as
command >output.txt 2>&1
In the first case, stderr is redirected to the current location of stdout and then stdout is redirected to output.txt,
but this second redirection affects only stdout, not stderr.
In the second case, stderr is redirected to the current location of stdout and that is output.txt.
منبع :
http://www.ibm.com/developerworks/library/l-lpic1-v3-103-4/

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
طبق برداشت من این هم همون چیزی که گفتم رو گفته.

stdout و stderr دو فایل هستند در سیستم عامل های unix based که در /dev هستند. چیز هایی که توشون ریخته میشه تو ترمینال نشون داده میشن.

در حالت عادی جریان stdout یک برنامه مثلن cout در زبان c++ به فایل stdout ریخته میشه و جریان stderr که مثلن میشه cerr در c++ به فایل stderr.

حالا گزینه ها.

تو گزینه D عبارت اول یعنی 1>&2 این کارو می کنه:‌ «جریان stdout رو میریزه (تغییر مسیر میده) به جایی که الان جریان stderr داره ریخته میشه» از اونجایی که تغییر قبلی نداشتیم جریان stderr به فایل stderr ریخته می شده پس الان stdout به فایل stderr ریخته میشه. حالا عبارت دوم >/dev/null میگه «جریان ‌stdout رو به /dev/null بریز» و این کار باعث میشه مسیر stdout دوباره تغییر کنه و تغییر قبلی بی اثر شه.
نتیجه نهایی این میشه که stdout به /dev/null ریخته میشه و در stderr هم تغییری به وجود نمیاد (به همون فایل stderr ریخته میشه).
یعنی هر چی برنامه تو stdout بنویسه نابود میشه ولی هرچی برنامه تو stderr بریزه که معمولا برنامه ها log هاشون رو این تو میریزن تو ترمینال نشون داده میشه. (نتیجه نهایی این مثل گزینه ‌A هست)

تو گزینه E عبارت 2>&1 این کارو می کنه: «جریان stderr رو تغییر مسیر میده به جایی که الان stdout داره بهش میریزه» و چون تغییر مسیر قبلی نداشتیم stdout به فایل stdout میریخته پس الان جریان stderr به فایل stdout ریخته میشه. حالا عبارت بعدی >/dev/null فقط جریان stdout رو تغییر مسیر میده به فایل /dev/null (سیاه چال).
نتیجه نهایی این میشه که جریان stderr به فایل stdout ریخته میشه و در نتیجه در ترمینال نشون داده میشه و جریان stdout نابود میشه.
این گزینه هم اگه برنامه تو ترمینال اجرا شه رفتارش مثل گزینه A و D هست ولی در حقیقت یه فرق هایی در پشت صحنه داره (جریان stderr از طریق فایل stdout تو ترمینال ریخته میشه به جای فایل stderr)
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین ali.abry

  • High Hero Member
  • *
  • ارسال: 1224
سلام خیلی ممنون برای توضیح کامل و خوبتون .
الان کامل متوجه شدم .
موضوع رو حل شد زدم