Порядок має значення, оскільки результат інший. Візьміть перший приклад:
Це спрямовує лише стандартний вивід на nul, оскільки стандартна помилка дублюється до стандартного виводу раніше стандартний висновок був перенаправлений на dirlist.
Це перенаправляє стандартний висновок і стандартну помилку в нуль.
Зауважте, що порядок переадресацій є значним. Наприклад,
команду
ls > dirlist 2>&1
направляє як стандартний висновок (дескриптор файлу 1), так і стандартну помилку
(дескриптор файлу 2) до файлу dirlist, при цьому виконується команда
ls 2>&1 > dirlist
направляє тільки стандартний вивід у файл dirlist, тому що стандарт
Помилка була зроблена копія стандартного виходу перед стандартом
вихід був переадресований на dirlist.
Порядок перенаправлення, тобто "& 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 перенаправляються до файлу.
n>&m
як, потік перенаправленняn
кудиm
наразі спрямовано на . Не перенаправляти потікn
до потокуm
.