Що означає оболонку, що означає "2> & 1"?


2282

В оболонці Unix, якщо я хочу , щоб об'єднати stderrі stdoutв stdoutпотік для подальших маніпуляцій, я можу додати наступне в кінці моєї команди:

2>&1

Отже, якщо я хочу використовувати headна виході з g++, я можу зробити щось подібне:

g++ lots_of_errors 2>&1 | head

тому я бачу лише перші кілька помилок.

Мені завжди виникають труднощі з цим запам'ятати, і мені постійно доводиться шукати це, і це головним чином тому, що я не повністю розумію синтаксис цього конкретного трюку.

Чи може хтось розбити це і пояснити персонаж за характером, що 2>&1 означає?


50
@dbr Я не думаю, що це просто баш - я вважаю, що це штука бурнів; звідси ш, баш, кш, попіл, тире тощо
гармати

8
Це частина абзацу перенаправлення, що описує оболонки, сумісні з POSIX, або оболонку POSIX. ksh - наприклад оболонка POSIX. Дивіться: pubs.opengroup.org/onlinepubs/009695399/utilities/…
jim mcnamara

12
Ця конструкція також працює в Windows.
Вадим

2
Це взагалі краще, 2>&1ніж 2> / dev / null ;-)
Ф. Хаурі

11
Я думав, що згадаю |& це скорочення, 2>&1 |якщо ви використовуєте zsh. Я не можу говорити, чи стосується це інших бурштинових снарядів чи це лише zsh.
хриксія

Відповіді:


2554

Дескриптор файлу 1 - це стандартний вихід ( stdout).
Дескриптор файлу 2 - це стандартна помилка ( stderr).

Ось один спосіб запам'ятати цю конструкцію (хоча це і не зовсім точно): у - перших, 2>1може виглядати як хороший спосіб , щоб переадресувати stderrдо stdout. Однак це буде насправді інтерпретуватися як "переадресація stderrдо імені файлу 1". &вказує, що далі - це дескриптор файлу, а не ім'я файлу. Таким чином, конструкція стає: 2>&1.


281
але тоді не повинно бути &2>&1?
докаспар

319
@Dominik: Ні, &інтерпретується лише як "дескриптор файлу" в контексті переадресації. Запис command &2>&розбирається як command &і 2>&1, тобто "запустити commandу фоновому режимі, потім виконати команду 2і перенаправити її stdout у свою stdout".
Адам Розенфілд

15
Чому вони вибирали такі таємничі речі, як цей? Просто цікаво.
CommaToast

81
Але як би ви перенаправили stderr до файлу з назвою "& 1"?
Мартін Фіксман

120
@Martin:2>'&1'

632
echo test > afile.txt

перенаправляє stdout на afile.txt. Це те саме, що робити

echo test 1> afile.txt

Щоб перенаправити stderr, виконайте такі дії:

echo test 2> afile.txt

>& є синтаксисом для перенаправлення потоку до іншого дескриптора файлу - 0 - stdin, 1 - stdout, а 2 - stderr.

Ви можете перенаправити stdout на stderr, виконавши:

echo test 1>&2 # or echo test >&2

Або навпаки:

echo test 2>&1

Отже, коротше ... 2>перенаправляє stderr до (не визначеного) файлу, додаючи &1перенаправлення stderr до stdout.


5
чи має це для вас сенс java ... 2&1 >> data.log, я бачив, як один з моїх колег це робив?
Thang Pham

5
@Harry, схожий або на оболонку, яка не є bash, або на друкарську помилку .. cmd 2>&1 >> somefile.logдодасть файл stdout / stderr до файлу - це в основному те саме, що і вище, >> fileдля додавання
dbr

73
@dbr cmd 2>&1 >>fileне перенаправляє stderr у файл, але cmd >> file 2>&1робить. Порядок питань. У першому випадку stderr переспрямовується на stdout оболонки (можливо, tty, якщо команда вводиться інтерактивно), а потім stdout спрямовується у файл. У другому випадку stdout спрямовується на файл, а потім stderr спрямовується на те саме місце.
Вільям Перселл

2
Мені подобається відповідь вище, але це може бути чіткішим на дотик. "2> & 1" перенаправляє stderr до цілі stdout. Отже, якщо у вас є щось на кшталт "ls -l >> directoryContents 2> & 1" Результатом буде файл з назвою directoryContents буде доданий до нього вміст робочого каталогу. Якщо є якісь помилки у виконанні: повідомлення про помилки також будуть додані до файлу directoryContents у міру їх виникнення.
Макс Вест,

1
Це 0(or 1,2)>&0(or 1,2)як варіант для контролю виходу? Це те echo test >test.log 2>&1саме, що echo test 2>&1 >test.log?
Сімін Джі

318

Деякі хитрощі щодо перенаправлення

Деякі особливості синтаксису щодо цього можуть мати важливу поведінку. Існує кілька маленьких зразків близько перенаправлень STDERR, STDOUTі аргументи впорядкованості .

1 - Переписування чи додавання?

Символ >означає перенаправлення .

  • >середнє надсилання до цілого завершеного файлу , перезапис цілі, якщо існує (див. noclobberфункцію bash на # 3 пізніше).
  • >>означає, що надіслати на додаток до додається до цілі, якщо існує.

У будь-якому випадку файл буде створений, якщо їх не існує.

2 - Командний рядок оболонки залежить від порядку !!

Для перевірки цього нам потрібна проста команда, яка надішле щось на обох результатах :

$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

(Очікуючи, що у вас немає каталогу з іменем /tnt, звичайно;). Ну, у нас це є !!

Отже, подивимось:

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

Останній командний рядок скидається STDERRна консоль, і, здається, це не очікувана поведінка ... Але ...

Якщо ви хочете виконати деяку фільтрувальну публікацію щодо одного виводу, іншого або обох:

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->

Зауважте, що останній командний рядок у цьому пункті точно такий же, як і в попередньому абзаці, де я писав, здається, не є очікуваною поведінкою (так, це може бути навіть очікувана поведінка).

Ну, є кілька хитрощів щодо переадресації для виконання різних операцій на обох результатах :

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2  2>&1  | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan  7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory

Нота: &9дескриптор виникне спонтанно через ) 9>&2.

Додаток: nota! З новою версією( >4.0) є нова функція та більш сексуальний синтаксис для подібних речей:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory

І нарешті для такого каскадного форматування виводу:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
     1  O: drwxrwxrwt 118 root root 196608 Jan  7 12:29 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

Додаток: nota! Новий синтаксис в обох напрямках:

$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
     1  O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

Там, де STDOUTпроходить конкретний фільтр, STDERRдо іншого і, нарешті, обидва виходи злиті проходять через третій фільтр команд.

3 - Слово про noclobberваріант і >|синтаксис

Ось про перезапис :

Хоча set -o noclobberдоручайте bash не перезаписати жоден існуючий файл, >|синтаксис дозволить вам пройти це обмеження:

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:21 CET 2013

Файл кожного разу перезаписується, а тепер:

$ set -o noclobber

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

Пройти через >|:

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013

Видалення цієї опції та / або запит, якщо вона вже встановлена.

$ set -o | grep noclobber
noclobber           on

$ set +o noclobber

$ set -o | grep noclobber
noclobber           off

$ date > $testfile ; cat $testfile
Mon Jan  7 13:24:27 CET 2013

$ rm $testfile

4 - Останній трюк та багато іншого ...

Для перенаправлення обох результатів із заданої команди ми бачимо, що правильним синтаксисом може бути:

$ ls -ld /tmp /tnt >/dev/null 2>&1

для цього особливого випадку існує синтаксис швидкого доступу: &>... або>&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

Примітка: якщо 2>&1існує, 1>&2то і правильний синтаксис:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4b - Тепер я дозволю вам подумати над:

$ ls -ld /tmp /tnt 2>&1 1>&2  | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1  | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

4c- Якщо вас цікавить додаткова інформація

Ви можете прочитати чудовий посібник, натиснувши:

man -Len -Pless\ +/^REDIRECTION bash

в консоль ;-)


5
Подальше читання: Якщо вам це сподобалось, ви можете оцінити: Як зловживання перенаправленням може
спричинити


130

Я знайшов цей геніальний пост про переадресацію: Все про переадресації

Перенаправити файл і на стандартний вихід, і на стандартну помилку

$ command &> файл

Цей однолінійний інструмент використовує &>оператор для перенаправлення обох вихідних потоків - stdout та stderr - з команди в файл. Це ярлик Bash для швидкого перенаправлення обох потоків до одного пункту призначення.

Ось як виглядає таблиця дескрипторів файлів після перенаправлення Bash обох потоків:

Введіть тут опис зображення

Як бачимо, тепер вказують і stdout, і stderr file. Отже, все, що написано stdout і stderr, записується на file.

Існує кілька способів перенаправлення обох потоків до одного пункту призначення. Ви можете перенаправляти кожен потік один за одним:

$ command> файл 2> & 1

Це набагато більш поширений спосіб перенаправлення обох потоків у файл. Спочатку stdout переспрямовується у файл, а потім дублюється stderr, щоб бути таким же, як і stdout. Так обидва потоки в кінцевому підсумку вказують на file.

Коли Баш бачить кілька перенаправлень, він обробляє їх зліва направо. Давайте пройдемося по кроках і подивимося, як це відбувається. Перед запуском будь-яких команд таблиця дескрипторів файлу Баша виглядає так:

Введіть тут опис зображення

Тепер Bash обробляє перше перенаправлення> файл. Ми вже бачили це раніше, і це робить stdout точку подання:

Введіть тут опис зображення

Далі Баш бачить друге перенаправлення 2> & 1. Ми не бачили цього перенаправлення раніше. Цей копій дескриптора файлу 2 є копією дескриптора файлу 1, і ми отримуємо:

Введіть тут опис зображення

Обидва потоки переспрямовано у файл.

Однак будьте обережні тут! Написання

команда> файл 2> & 1

не те саме, що писати:

$ command 2> & 1> файл

Порядок переадресації має значення в Bash! Ця команда переспрямовує лише стандартний вихід у файл. Stderr все ще надрукує до терміналу. Щоб зрозуміти, чому це відбувається, давайте переглянемо кроки ще раз. Тому перед запуском команди таблиця дескрипторів файлів виглядає приблизно так:

Введіть тут опис зображення

Тепер Bash обробляє переадресації зліва направо. Він спочатку бачить 2> & 1, тому він дублює stderr в stdout. Таблиця дескрипторів файлів стає:

Введіть тут опис зображення

Тепер Bash бачить друге переспрямування >file, і він перенаправляє stdout до файлу:

Введіть тут опис зображення

Ви бачите, що тут відбувається? Тепер Stdout вказує на файл, але stderr все одно вказує на термінал! Все, що пишеться на stderr, все одно виводиться на екран! Тож будьте дуже, дуже обережні з порядком переадресації!

Також зауважте, що в Bash пишуть

$ command &> файл

точно такий же, як:

$ command> & файл


3
Останні два відрізняються, якщо "команда" закінчується числом, оскільки тоді це приймається як необов'язковий дескриптор файлу>&
MM

Дуже приємний малюнок та пояснення! Не могли б ви пояснити, що насправді означає "дублікат"? Ви згадали: "Цей [2> & 1] копіює дескриптор файлу 2, щоб бути копією дескриптора файлу 1". Це здається, що stderr дублюється до stdout. Але якщо це так, чи варто також бачити помилку /dev/tty0?
HCSF

87

Цифри відносяться до дескрипторів файлів (fd).

  • Нуль є stdin
  • Один є stdout
  • Два є stderr

2>&1 перенаправляє fd 2 до 1.

Це працює для будь-якої кількості дескрипторів файлів, якщо програма їх використовує.

Ви можете подивитися, /usr/include/unistd.hякщо ви їх забули:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

Це означає, що я написав інструменти C, які використовують нестандартні дескриптори файлів для користувальницького журналу, тому ви не бачите цього, якщо ви не перенаправите його на файл чи щось таке.


58

Ця конструкція посилає стандартний потік помилок ( stderr) у поточне місце стандартного виводу ( stdout) - видається, що цією проблемою валюти були нехтувані іншими відповідями.

Ви можете перенаправити будь-яку ручку виводу на іншу, використовуючи цей метод, але найчастіше використовується для каналізації stdoutта stderrпотоків в єдиний потік для обробки.

Деякі приклади:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

Зверніть увагу , що цей останній буде НЕ направляти stderrна outfile2- він перенаправляє його на те , що stdoutбуло , коли аргумент зустрічалися ( outfile1) і потім перенаправляє stdoutдо outfile2.

Це дозволяє зробити деякі досить складні хитрощі.


5
Хоча останній приклад був би набагато зрозумілішим як: foo> outfile2 2> outfile1
Майкл Креймер

3
Ясніше, так, але це не показало б "позиційного" характеру перенаправлення. Приклад надуманий, оскільки зазвичай це не корисно робити в одному рядку - метод стає дійсно корисним, коли різні сторони відповідають за різні частини перенаправлення. Наприклад, коли сценарій робить один біт перенаправлення, а ви запускаєте його з іншим бітом.
паксдіабло

5
Я просто зрозумів , що останній приклад також дозволяє давню плутанину я щодо того, чому це: some_program 2>&1 > /dev/nullне працює так: some_program > /dev/null 2>&1.
snapfractalpop

Ваш коментар щодо останнього прикладу вартий букв із золотом :-) Я ніколи не думав, що ці аргументи про перенаправлення позиційні ... Я думаю, що це досить важливо знати.
Nils-o-mat

20

2>&1- це конструкція оболонки POSIX. Ось розбивка, позначена токеном:


2: Дескриптор вихідного файлу " Стандартна помилка ".

>&: Дублювання оператора дескриптора вихідного файлу (варіант оператора перенаправлення виводу> ). Враховуючи [x]>&[y], дескриптор файлу, позначений символом, xробиться копією дескриптора вихідного файлу y.

1Дескриптор вихідного файлу " Стандартний вихід ".

Вираз 2>&1копіює дескриптор файлу 1в місце розташування 2, тому будь-який вихід, записаний у 2("стандартна помилка") у середовищі виконання, переходить у той самий файл, який спочатку описано 1("стандартний вихід").


Подальше пояснення:

Дескриптор файлу : "Унікальне ціле ціле число, яке використовується для ідентифікації відкритого файлу з метою доступу до файлу."

Стандартний вихід / помилка : див. Наступну примітку в Перенаправлення документації на оболонку:

Відкриті файли представлені десятковими числами, починаючи з нуля. Найбільша можлива цінність - визначена реалізацією; однак всі реалізації повинні підтримувати щонайменше від 0 до 9 включно для використання додатком. Ці числа називаються "дескрипторами файлів". Значення 0, 1 і 2 мають особливе значення та звичайні вживання та мають на увазі певні операції перенаправлення; їх називають відповідно стандартним входом, стандартним виходом та стандартною помилкою. Програми зазвичай беруть свій вхід зі стандартного вводу, а записують вихід на стандартний вихід. Повідомлення про помилки зазвичай записуються на стандартній помилці. Операторам перенаправлення може передувати одна чи більше цифр (без втручаються символів), щоб позначити номер дескриптора файлу.


19

2 - стандартна помилка консолі.

1 - стандартний вихід консолі.

Це стандартний Unix, і Windows також слідкує за POSIX.

Наприклад, коли ти біжиш

perl test.pl 2>&1

стандартна помилка переспрямовується на стандартний вихід, тому ви можете бачити обидва виходи разом:

perl test.pl > debug.log 2>&1

Після виконання ви можете побачити весь вихід, включаючи помилки, в debug.log.

perl test.pl 1>out.log 2>err.log

Потім стандартний вихід переходить до out.log, а стандартний помилка - до err.log.

Я пропоную вам спробувати зрозуміти це.


Другий зразок невірний: оскільки пріоритет порядку STDERR буде перенаправлений на STDOUT , до debug.log (не STDERR ) буде записаний лише стандартний STDOUT , дивіться мою відповідь (абзац №2)! Щоб переспрямувати обидва файли в один і той же файл, ви повинні інвертувати директиви щодо переадресації:perl test.pl > debug.log 2>&1
F. Hauri

16

Щоб відповісти на ваше запитання: він приймає будь-який вихід помилки (зазвичай надсилається до stderr) і записує його на стандартний вихід (stdout).

Це корисно, наприклад, "більше", коли вам потрібна підказка для всіх результатів. Деякі програми, такі як друк інформації про використання в stderr.

Щоб допомогти вам запам'ятати

  • 1 = стандартний вихід (де програми друкують нормальний вихід)
  • 2 = стандартна помилка (де програми друкують помилки)

"2> & 1" просто вказує на все, надіслане stderr, а не на stdout.

Я також рекомендую прочитати цю публікацію при переадресації помилок, де ця тема висвітлена повністю.


11

З точки зору програміста, це означає саме це:

dup2(1, 2);

Дивіться сторінку чоловіка .

Розуміння того, що 2>&1є копією, також пояснює, чому ...

command >file 2>&1

... не те саме, що ...

command 2>&1 >file

Перший надсилатиме обидва потоки file, тоді як другий надсилає помилки stdoutта звичайний вихід у file.


9

Я вважаю це дуже корисним, якщо ви починаєте читати це

Оновлення:
в Linux або Unix System є два місця програми, які надсилають вихід на: Стандартний вихід (stdout) і Стандартна помилка (stderr). Ви можете перенаправити ці дані на будь-який файл.

Ніби, якщо ви це зробите,

ls -a > output.txt

нічого не буде надруковано в консолі весь вихід (stdout) буде перенаправлений на вихідний файл.

І якщо ви спробуєте надрукувати вміст будь-якого файлу, який не виходить, значить, виведення буде помилкою, наприклад, якщо ви надрукуєте test.txt, який не присутній у поточному каталозі.

cat test.txt > error.txt

Вихід буде

cat: test.txt :No such file or directory

Але файл error.txt буде порожнім, оскільки ми перенаправляємо stdout у файл не stderr.

тому нам потрібен дескриптор файлу (Дескриптор файлу - це не що інше, як позитивне ціле число, яке представляє відкритий файл. Ви можете сказати, що дескриптор є унікальним ідентифікатором файлу), щоб сказати оболонці, який тип виводу ми надсилаємо до файлу. У Unix / Linux системі 1 призначено для stdout і 2 для stderr .

тому зараз, якщо ви це зробите,

ls -a 1> output.txtви надсилаєте стандартний вихід (stdout) на output.txt.

і якщо це зробити, це

cat test.txt 2> error.txtозначає, що ви надсилаєте стандартну помилку (stderr) на сторінку error.txt.

&1використовується для посилання на значення дескриптора файлу 1 (stdout).

Тепер до точки 2>&1означає «Перенаправляємо stderr на те саме місце, де ми перенаправляємо stdout»

Тепер ви можете це зробити

cat maybefile.txt > output.txt 2>&1

і стандартний вихід (stdout), і стандартна помилка (stderr) будуть перенаправлені на output.txt.

Дякуємо Ондрей К. за те, що він вказав


1
Відповіді лише на посилання є проблематичними. Посилання може стати неіснуючим, що робить відповідь марною. Ви завжди повинні містити достатньо деталей у самій відповіді.
Ондрей К.

7

Люди, завжди пам'ятайте paxdiablo натяк «s про поточному місцезнаходження цілі Перенаправлення ... Це є важливим.

Моя особиста мнеміка для 2>&1оператора:

  • Подумайте, &як сенс 'and'або 'add'(персонаж - ампер - і чи не так?)
  • Так воно стає: 'redirect 2(stderr) на куди 1(stdout) вже / зараз є, і додайте обидва потоки' .

Те ж саме мнемонічне працює і для інших часто використовуваних перенаправлень 1>&2:

  • Подумайте про &значення andабо add... (ви розумієте про амперсанд, так?)
  • Так воно стає: 'перенаправлення 1(stdout) на те, де 2(stderr) вже / зараз є, і додайте обидва потоки' .

І завжди пам’ятайте: ви повинні читати ланцюжки перенаправлень «з кінця», справа наліво ( не зліва направо).


7

Перенаправлення вводу

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

Загальний формат для переадресації вводу:

[n]<word

Перенаправлення виводу

Перенаправлення виводу призводить до того, що файл, назва якого в результаті розширення слова, відкривається для запису на дескриптор файлу n, або стандартний вихід (дескриптор 1 файлу), якщо n не вказано. Якщо файл не існує, він створюється; якщо він існує, він обрізаний нульовим розміром.

Загальний формат для переадресації виводу:

[n]>word

Дескриптори переміщення файлів

Оператор перенаправлення,

[n]<&digit-

переміщує цифру дескриптора файлу до дескриптора файлу n або стандартного вводу (дескриптор файлу 0), якщо n не вказано. цифра закрита після дублювання n.

Аналогічно оператор перенаправлення

[n]>&digit-

переміщує цифру дескриптора файлу до дескриптора файлу n або стандартного виводу (дескриптор файлу 1), якщо n не вказано.

Довідка:

man bash

Введіть, /^REDIRECTщоб знайти redirectionрозділ та дізнатися більше ...

Інтернет-версія тут: 3.6 Перенаправлення

PS:

Багато часу manбув потужним інструментом для вивчення Linux.


6

За умови, що /fooне існує у вашій системі та є /tmp

$ ls -l /tmp /foo

буде надрукувати вміст /tmpта надрукувати повідомлення про помилку для/foo

$ ls -l /tmp /foo > /dev/null

посилатиме вміст /tmpв /dev/nullі виводить повідомлення про помилку для/foo

$ ls -l /tmp /foo 1> /dev/null

зробимо точно так само (зверніть увагу на 1 )

$ ls -l /tmp /foo 2> /dev/null

надрукує вміст /tmpта надішле повідомлення про помилку/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

надішлемо як лістинг, так і повідомлення про помилку /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

це стенограма


5

Це так само, як передача помилки stdout або терміналу.

Тобто, cmdце не команда:

$cmd 2>filename
cat filename

command not found

Помилка надсилається у такий файл:

2>&1

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


1

0 для введення, 1 для stdout та 2 для stderr.

Одна порада : somecmd >1.txt 2>&1правильно, хоча somecmd 2>&1 >1.txtабсолютно не так, без ефекту!


1

unix_commands 2>&1

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

Далі ілюструється процес

  • Коли помилки виробляються, вони записуються в стандартну адресу пам'яті помилок &2"буфер", з якої 2посилається стандартний потік помилок .
  • Коли виробляється вихід, він записується в стандартну адресу вихідної пам'яті &1"буфер", з якої 1посилається стандартний вихідний потік .

Тому візьміть unix_commandsстандартний потік помилок 2і перенаправіть >потік (помилок) на стандартну адресу вихідної пам'яті &1, щоб вони були передані в термінал і надруковані.

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