Що саме означає перенаправлення на вихід?


19

Я бачу речі на кшталт command 1> outабо з, 2>&1щоб перенаправляти stderr, але іноді я бачу &>і сам, і т.д.

Який найкращий спосіб зрозуміти &і що саме це означає?

Відповіді:


26

&У 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. Дозвольте проілюструвати це прикладом.

Налаштування:

  1. Створіть файл kokoіз таким вмістом:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Зробіть його виконуваним: chmod u+x koko

  3. Тепер зауважте, що j1не існує

  4. Тепер біжи ./koko &> output

  5. біжи 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, так що вона з’явиться в терміналі, і ви зможете передати її чи перенаправити. знову, але він не буде записаний у файл.


2
Що таке &>середина?
AJJ

1
Зауважте, що в command >file 2>&1порядку переадресації важливо. Якщо ви пишете command 2>&1 >fileзамість цього (що зазвичай не є тим, що ви хочете), він спочатку перенаправить stdout команди у файл, а після цього перенаправить stderr команди на невикористаний тепер stdout, так що він відобразиться в терміналі, і ви можете передати його або перенаправити його ще раз, але він не буде записаний у файл.
Байт командир

2
"Це буде надіслано тому, standard outputщо ви побачите у своєму терміналі." чи не повинно це бути "до standard error"?
frarugi87

1
Так @ frarugi87 ваше право виправлено
Джордж Удосен

1
@George вау, ви були швидкими;) Гарна робота
frarugi87

5

2
IIRC &> FILEхарактерний лише для Bash, тоді як >FILE 2>&1його розуміють більша кількість оболонок.
Байт командир

@ByteCommander, о, я навіть не знав, що в Баша була така скорочення ... Я завжди використовував 2> & 1.
psusi

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, який не є синтаксично допустимим баш-кодом? .

Дивись також:

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