Як ви запам’ятали синтаксис перенаправлення 2> і 1 [закрито]


12

У вас мнемоніка чи система? Це мене турбує роками, я завжди мушу це шукати

Відповіді:


19

Якщо ви програміст на C, ви можете вважати його &1"адресою 1", тому 2>&1"дескриптор файлу переадресації №2 " читає на те саме місце, що і №1 ".


Не знаю, чи це допомагає ... Мнемоніка - це особиста штука.
lgeorget

+12 Це також правильний опис того, що відбувається.
Стефан Шазелас

1
Цікаво, чи це так, як це було продумано ("адреса 1"), коли воно було винайдено. Оскільки деякі люди вносили великий внесок у мову С та UNIX, коли вони були винайдені, це можливо
lgeorget

1
Я можу замість цього почати використовувати;)
goldilocks

3

"Два до одного" ("до" буття >) має для мене більш логічний сенс, ніж "Два і один", саме з цим я зазвичай можу плутати. Якщо ви розглядаєте "і один" як один іменник (місце), це також має граматичний сенс у контексті, що складніше зробити з "двома та одним" - вам доведеться вважати "одним" одним іменник, і це все одно не мало б контекстного сенсу.


2
Я не розумію
Метт,

2

Не мнемонічний, але я читав так:

0є stdin. 1є stdout. 2важче. >входить. <є поза. &це дескриптор файлів (у деяких оболонках).

2>&1
2      >    &               1
stderr into file descriptor 1

redirect stderr into stdout

Це може змінитися, якщо ви заблукали з будь-яким із дескрипторів файлів до перенаправлення ...

2>somefile 1>&2
2      >    somefile     1      >    &2
stderr into somefile and stdout into file descriptor 2

redirect stderr into somefile and stdout into somefile. 

2

Коли ви пишете 2>&1, ви говорите, що "стандартна помилка переходить до стандартного виводу".

Давайте розбимо це.

Спочатку потрібно запам'ятати, що стандартна помилка є, 2а стандартний вихідний 1.

Отже, у вас 2щось щось є 1.

"йде в" пишеться >.

Значить, у вас 2>щось є 1.

2>filenameозначає надіслати стандартну помилку на filename. Але ви не хочете відправляти його у файл, який називається 1. Вам потрібно ще щось: номер уже відкритого файлу. Ось для чого &це.

Отже 2>&1.

Ви також можете думати про це так, як ви робили завдання, де >є як рівне, а таке &- як $, порівняйте:

f=$1
2>&1

Щоб зрозуміти командний рядок з декількома перенаправленнями, важливо знати, що перенаправлення виконуються зліва направо. Докладніше про це див. У розділі Порядок переадресацій .


0

Я згадав, що це завжди 2 -> 1. Stderr to stdout.

Середня частина - це завжди жорстка, і я завжди її псував, поки не згадав, що спочатку приходить різкий персонаж >, потім персонаж, якого я не можу написати в реальному житті &.

Так ніколи 2&>1, завжди2>&1


0

Якщо ви розумієте, що FD2 є STDERR, ви можете подумати: "О, і захопити STDERR куди-небудь, коли я надсилаю STDOUT (FD1)".


0

Мої колеги, і я, як правило, кажу, що «два більше, ніж один», тому що більшість з нас не завжди пам’ятає, що stderrце дескриптор файлів 2і stdoutє 1(особливо ті, що є новими для unix / linux), тому інші мнемоніки щодо переадресації stderrнасправді не працюють. . Проблема лише в тому, що вам залишається пам'ятати, куди йде амперсанд!

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