порядок перенаправлення стандартних потоків оболонки OR 2> & 1 1> / dev / null vs 1> / dev / null 2> & 1


3

Може хтось, будь ласка, пояснити відмінності? Чи вважаються деякі з них найкращою практикою? Якщо я правильно пам'ятаю, то я якось на ТУ читав, що це 1>/dev/null має передувати цьому: 2>&1

ls -al /doesNotExists 2>&1 1>/dev/null
ls -al /doesNotExists 1>/dev/null 2>&1

ls -al /doesNotExists 1>&2 2>/dev/null
ls -al /doesNotExists 2>/dev/null 1>&2

ls -la /doesNotExists 2<&1 1>/dev/null
ls -la /doesNotExists 2<&1 2>/dev/null

ls -la /doesNotExists 1<&2 1>/dev/null
ls -la /doesNotExists 1<&2 2>/dev/null

ls -la /doesNotExists 1>/dev/null 2<&1
ls -la /doesNotExists 2>/dev/null 2<&1

ls -la /doesNotExists 1>/dev/null 1<&2
ls -la /doesNotExists 2>/dev/null 1<&2

2
Читайте n>&m як, потік перенаправлення n куди m наразі спрямовано на . Не перенаправляти потік n до потоку m.
ctrl-alt-delor

Відповіді:


7

оболонка стандартного потоку порядку перенаправлення

Порядок має значення, оскільки результат інший. Візьміть перший приклад:

ls -al /doesNotExists 2>&1 1>/dev/null

Це спрямовує лише стандартний вивід на nul, оскільки стандартна помилка дублюється до стандартного виводу раніше стандартний висновок був перенаправлений на dirlist.

ls -al /doesNotExists 1>/dev/null 2>&1

Це перенаправляє стандартний висновок і стандартну помилку в нуль.


Довідковий посібник Bash: перенаправлення

Зауважте, що порядок переадресацій є значним. Наприклад,   команду

ls > dirlist 2>&1

направляє як стандартний висновок (дескриптор файлу 1), так і стандартну помилку   (дескриптор файлу 2) до файлу dirlist, при цьому виконується команда

ls 2>&1 > dirlist

направляє тільки стандартний вивід у файл dirlist, тому що стандарт   Помилка була зроблена копія стандартного виходу перед стандартом   вихід був переадресований на dirlist.

Джерело Довідковий посібник Bash: перенаправлення


Підручник

Існує хороший підручник з ілюстрацією Ілюстрований підручник з перенаправлення що полегшує розуміння:

Порядок перенаправлення, тобто "& gt; файл 2 & gt; 1" у порівнянні з файлом "2 & gt; 1 & gt;"

Хоча це не має значення, де перенаправлення з'являються в команді   лінія, їх порядок має значення. Вони налаштовані зліва направо.

2>&1 >file

Поширеною помилкою є команда 2 & gt; 1 & gt; файл для перенаправлення обох stderr   і stdout до файлу. Давайте подивимося, що відбувається. Спочатку набираємо   в нашому типовому терміналі, дескриптори виглядають так:

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

Тоді наша оболонка, Bash бачить 2 & gt; 1, тому вона дублює 1, а файл   дескриптор виглядає так:

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

Це вірно, нічого не змінилося, 2 вже вказує на те ж саме   розмістити як 1. Тепер Bash бачить & gt; файл і таким чином змінює stdout:

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| file                  |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

І це не те, чого ми хочемо.

>file 2>&1

Тепер давайте розглянемо правильну команду & gt; file 2 & gt; & amp; 1. Починаємо як у   попереднього прикладу, а Bash бачить & gt; файл:

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| file                  |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

Потім він бачить наше дублювання 2 & gt; & amp; 1:

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| file                  |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| file                  |
                  ---       +-----------------------+

І вуаля, як 1, так і 2 перенаправляються до файлу.


Дякуємо, хороша інформаційна графіка. Всього два роз'яснення: 1. ls > /dev/null це те ж саме, що ls 1> /dev/null 2. Коли є < використовується? я намагався ls -l >file &1<2 і це не те саме, що ls >file 2>&1. Є cat file дорівнює cat <file чи є приклади, де це не є еквівалентом? спасибі
Wakan Tanka

@ WakanTanka 1 / yes (1 означає лише вихід std). 2 / & lt; використовується для перенаправлення введення (файл cat є таким же, як cat & lt; файл)
DavidPostill

Коли корисно перенаправити вхід, він може відкрити його, як я показав, навіщо перенаправляти?
Wakan Tanka

Просто для уточнення відповіді в коментарі: cat <file є таким же, як cat file тому що кіт читає з stdin, коли він не отримує аргументів. ls file не те саме, що ls <file, як пізніше очікує знайти список файлів у файлі, а перший просто перерахує один файл, file.
Tiago

Це пояснення дуже приємне. Дякуємо за діаграму.
Jingguo Yao
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.