Відповіді:
&У 2>&1просто говорить про те, що число 1це дескриптор файлу , а не ім'я файлу. В цьому випадку standard output file descriptor.
Якщо ви використовуєте 2>1, то це призведе до переадресації помилок у файл, який називається, 1але якщо ви використовуєте 2>&1, то він надішле його до standard output stream.
Це &>говорить надсилати і те, standard outputі standard errorдесь. Так , наприклад, ls <non-existent_file> &> out.file. Дозвольте проілюструвати це прикладом.
Налаштування:
Створіть файл kokoіз таким вмістом:
#!bin/bash
ls j1
echo "koko2"
Зробіть його виконуваним: chmod u+x koko
Тепер зауважте, що j1не існує
Тепер біжи ./koko &> output
біжи cat outputі побачиш
ls: cannot access 'j1': No such file or directory
koko2
Обидва, standard error( ls: cannot access 'j1': No such file or directory) та standard output( koko2) були надіслані у файл output.
Тепер запустіть його ще раз, але цього разу так:
./koko > output
Зробіть, cat outputі ви побачите лише koko2подібне. Але не помилка виводиться з ls j1команди. Це буде надіслано тому, standard errorщо ви побачите у своєму терміналі.
Важлива примітка завдяки @Byte Commander:
Зауважте, що в command >file 2>&1порядку перенаправлення важливо. Якщо ви запишете command 2>&1 >fileзамість цього (що зазвичай не є тим, що ви хочете), він спочатку перенаправить команду stdoutна файл, а після цього перенаправить команду stderrна теперішньо невикористану stdout, так що вона з’явиться в терміналі, і ви зможете передати її чи перенаправити. знову, але він не буде записаний у файл.
command >file 2>&1порядку переадресації важливо. Якщо ви пишете command 2>&1 >fileзамість цього (що зазвичай не є тим, що ви хочете), він спочатку перенаправить stdout команди у файл, а після цього перенаправить stderr команди на невикористаний тепер stdout, так що він відобразиться в терміналі, і ви можете передати його або перенаправити його ще раз, але він не буде записаний у файл.
standard outputщо ви побачите у своєму терміналі." чи не повинно це бути "до standard error"?
> FILE 2>&1і &> FILEє рівнозначними. Див. 8.2.3.2. Перенаправлення помилок у Посібнику Bash для початківців Глава 8
&> FILEхарактерний лише для Bash, тоді як >FILE 2>&1його розуміють більша кількість оболонок.
Це [n]>&wordназивається копіюванням дескриптора вихідних файлів (див. Розділ 2.7.6 стандарту мови мови оболонки POSIX). Це конкретне поведінку особливістю Борн-подібних оболонок, в тому числі ksh, dashі bash; насправді стандарт базується на оболонці Борна і ksh. Дивлячись на посібники з tcsh та csh , вони, мабуть, не забезпечують можливості копіювання будь-якого дескриптора файлів, однак з опису >&це поводиться як &>у bash(тобто переспрямовує помилки та нормальний вихід у файл).
У * nix подібних системах, включаючи Ubuntu, ви часто чуєте, що все є файлом, а точніше дескриптором файлів . Стандартний вихід - це постійний дескриптор файлу 1, а стандартною помилкою є дескриптор файлу 2. Отже, > FILE 2>&1технічно означає повторюваний дескриптор файлу 2 на дескриптор файлу 1. Іншими словами цього відповіді :
2> & 1 вказує оболонці надати команді дескриптор файлу 2, який є дублікатом дескриптора 1. (тобто, stderr & stdout вказують на той самий fd).
Тут важливо зазначити, що дескриптор 1 повинен бути встановлений спочатку. Оскільки оболонка обробляє перенаправлення в лівому та правому порядку, command >FILE 2>&1говорить оболонці потрібно перенаправляти stdout для того, commandщоб перейти в FILEперший, і лише тоді дескриптор 2 може стати копією 1, тобто 1 і 2 вказувати на те саме місце - FILE.
Це звичайно виходить за рамки стандартної помилки та стандартного виводу. Як показують у цій відповіді , виконуючи це3&>2
... ви копіюєте (dup2) поданий критерий 2 на файл fileescriptor 3, можливо, закриваючи fileescriptor 3, якщо він уже відкритий
Приклад маніпулювання дескрипторами файлів, серед багатьох, був би захоплення виводу dialogкоманди в змінну
Також варто зазначити, що &>специфічно bash. При zshцьому поводиться так само, але згідно з документацією, "... не має такого ж ефекту, як '> слово 2> & 1' у присутності мультіо". У сумісності POSIX/bin/sh це трактується як регулярне перенаправлення з виведенням команди на другий план. Дивіться також: Чи існує код sh, який не є синтаксично допустимим баш-кодом? .
Дивись також:
&>середина?