Відповіді:
&
У 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, який не є синтаксично допустимим баш-кодом? .
Дивись також:
&>
середина?