سؤال

وأنا أخذ نظرة على رمز لفائدة "أقل"، على وجه التحديد كيف يحصل مدخلات لوحة المفاتيح. ومن المثير للاهتمام، على الخط 80 من ttyin.c، يقوم بتعيين واصف ملف القراءة من:

     /*
      * Try /dev/tty.
      * If that doesn't work, use file descriptor 2,
      * which in Unix is usually attached to the screen,
      * but also usually lets you read from the keyboard.
      */
  #if OS2
      /* The __open() system call translates "/dev/tty" to "con". */
      tty = __open("/dev/tty", OPEN_READ);
  #else
      tty = open("/dev/tty", OPEN_READ);
  #endif
      if (tty < 0)
          tty = 2;

وليس ملف واصف 2 ستدير؟ إذا كان الأمر كذلك، WTH ؟! اعتقدت تم إرسال مدخلات لوحة المفاتيح من خلال ستدين.

ومن المثير للاهتمام، حتى لو كنت لا ls -l * | less، بعد انتهاء ملف التحميل، ويمكنك الاستمرار في استخدام لوحة المفاتيح للانتقال إلى أعلى وأسفل، ولكن إذا كنت تفعل ls -l * | vi، ثم السادس والصراخ لك لأنه لا يقرأ من ستدين. ما هي الفكرة الكبيرة؟ كيف لي أن ينتهي بهم المطاف في هذه الأرض جديدة وغريبة حيث ستدير على حد سواء وسيلة لتقرير الأخطاء إلى الشاشة وقراءة من لوحة المفاتيح؟ لا أعتقد أنا في كنساس بعد الآن ...

هل كانت مفيدة؟

المحلول

$ ls -l /dev/fd/
lrwx------ 1 me me 64 2009-09-17 16:52 0 -> /dev/pts/4
lrwx------ 1 me me 64 2009-09-17 16:52 1 -> /dev/pts/4
lrwx------ 1 me me 64 2009-09-17 16:52 2 -> /dev/pts/4

وعند تسجيل الدخول في محطة interative، فإن كل واصفات الملفات القياسية ثلاثة إلى نفس الشيء: TTY (أو شبه TTY)

$ ls -fl /dev/std{in,out,err}
lrwxrwxrwx 1 root root 4 2009-09-13 01:57 /dev/stdin -> fd/0
lrwxrwxrwx 1 root root 4 2009-09-13 01:57 /dev/stdout -> fd/1
lrwxrwxrwx 1 root root 4 2009-09-13 01:57 /dev/stderr -> fd/2

حسب الاتفاقية، نقرأ من 0 والكتابة إلى 1 و2. ومع ذلك، لا شيء يمنعنا من القيام خلاف ذلك.

وعند تشغيل قذيفة بك ls -l * | less، فإنه يخلق الأنابيب من ls ملف اصف 1 لless ملف اصف 0 ل. ومن الواضح أن less لم تعد قراءة مدخلات لوحة المفاتيح المستخدم من 0 ملف واصف - أنه يحاول الحصول على TTY الخلف مهما ما في وسعها

إذا لم يتم فصل less من المحطة، وopen("/dev/tty") اعطائها TTY.

ولكن، في حالة فشل ذلك ... ماذا يمكنك ان تفعل؟ less يجعل محاولة أخيرة في الحصول على TTY، على افتراض أن يتم إرفاق ملف 2 اصف إلى نفس الشيء الذي 0 ملف واصف أن ترفق، إذا لم يتم إعادة توجيه ذلك.

هذه على لا

$ ls -l * | setsid less 2>/dev/null

وهنا، وتعطى less دورته الخاصة (لذلك لم يعد جزءا من مجموعة عملية نشطة المحطة، مما تسبب open("/dev/tty") أن تفشل)، وتم تغيير 2 ملف اصف لها - الآن مخارج less فورا، لأنه إخراج لTTY بعد فشل الحصول على أي إدخال المستخدم.

نصائح أخرى

وحسنا ... أولا، يبدو أنك في عداد المفقودين الدعوة open() الذي يفتح '/ ديف / الكتابة البعيدة. ويستخدم فقط ملف واصف 2 اذا كانت الدعوة لفتح () فشل. على نظام لينكس القياسية، وربما العديد من Unices، '/ ديف / الكتابة البعيدة' موجود وليس من المرجح أن يؤدي إلى الفشل.

وثانيا، التعليق على رأس يوفر كمية محدودة من تفسير لماذا تراجع إلى اصف ملف 2. تخميني هو أن stdin، stdout، وstderr ترتبط الى حد كبير ل'/ ديف / TTY /' على أي حال ، إلا إذا تمت إعادة توجيهه. ومنذ إعادة توجيه الأكثر شيوعا عن ستدين و / أو المعياري (عبر الأنابيب أو < / >)، ولكن أقل في كثير من الأحيان لstderr، على خلاف هي أن استخدام stderr سيكون من المرجح أن يكون لا يزال الاتصال "لوحة المفاتيح".

ونفس السؤال مع الجواب في نهاية المطاف من الشخص الذي يطلب منه على <لأ href = "http://www.linuxquestions.org/questions/linux-general-1/more-and-less-piped-commands -The-سر-من-ث-خفية ستدين-729318 / "يختلط =" نوفولو noreferrer "> linuxquestions على الرغم من أنها تعبير مصدر مختلف قليلا من less. ولا، أنا لا أفهم أكثر من ذلك حتى لا يسعني بعد ذلك:)

ويبدو أن لينكس وظائف محددة التي ترسل مدخلات لوحة المفاتيح لFD 2.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top