Что происходит при перенаправлении с помощью 3>&1 1>/dev/null?

Вы не можете анализировать [X]HTML/XML с помощью регулярных выражений. Поскольку HTML/XML не может быть проанализирован регулярным выражением. Regex не является инструментом, который можно использовать для правильного анализа HTML/XML. Регулярные выражения — это инструмент, недостаточно сложный для понимания конструкций, используемых в HTML/XML. HTML/XML не является обычным языком и, следовательно, не может анализироваться с помощью регулярных выражений. Запросы регулярных выражений не приспособлены для разбиения HTML/XML на значимые части. Даже расширенные нерегулярные регулярные выражения, используемые в Perl, не справляются с задачей разбора HTML/XML. Ты никогда не заставишь меня сломаться. HTML/XML — это языки достаточной сложности, чтобы их нельзя было проанализировать с помощью регулярных выражений. Даже Джон Скит не может анализировать HTML/XML с помощью регулярных выражений. Каждый раз, когда вы пытаетесь разобрать HTML/XML с помощью регулярных выражений, нечестивое дитя плачет кровью девственниц, а русские хакеры взламывают ваше веб-приложение. Разбор их с помощью регулярных выражений вызывает испорченные души в царство живых. Они и регулярное выражение идут рука об руку, как любовь, брак и ритуальное детоубийство.

не может удержаться, слишком поздно. Сила регулярных выражений и HTML/XML вместе в одном концептуальном пространстве разрушит ваш разум, как водянистая замазка. Если вы анализируете регулярное выражение, вы уступаете Им и их кощунственным методам, которые обрекают всех нас на нечеловеческий труд ради Того, Чье Имя не может быть выражено на Основном Многоязычном Плане, он приходит. HTML -плюс регулярное выражение -разжижают нервы разумного, пока вы наблюдаете, как ваша душа увядает под натиском ужаса.Парсеры HTML/XML на основе Rege̿̔̉x -— это рак, который убивает StackOverflow слишком поздно, слишком поздно, мы не можем быть спасены проделки ребенка гарантируют, что регулярное выражение поглотит все живые ткани (, кроме для HTML, чего он не может, как было предсказано ранее)Господи, помоги нам, как кто-то может пережить это бедствие использование регулярных выражений для разбора HTML обрекло человечество на вечность ужасных пыток и дыр в безопасности использование rege x как инструмент для обработки HTML устанавливает разрыв ch между этим миром и ужасным царством несовершенных сущностей (, подобных сущностям SGML, но более коррумпированным )простым проблеском мира reg​ ex парсеры для HTML мгновенно ​перенесут ap сознание программиста i в aw orl d непрекращающегося крика, он приходит , зараза sl ithy regex -l поглотит ваш синтаксический анализатор HT ​ML, приложение и существование на все времена как Visual Basic только хуже он приходит он приходит es не fi ​ght h e com̡e̶s, ̕h̵i ​s un̨ho͞ly radiańcé de строим все условия, HTML-теги lea͠ki̧n͘g fr̶ǫm ̡yo​ur eye͢s̸ ̛l̕ik͏e liq ​uid p ain,песня регулярного опыта анализ сеанса выведет ​nguish the voices of mor​ tal man from the sp ​вот я вижу это вы видите ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ это прекрасный т​ он ф inal snufфинг о ф ложь​ s человека ВСЁ LOŚ͖̩͇̗̪̏̈́T ALL I​SL OST th e pon̷y он пришел s he c̶̮om es he come st he ich​ or permeat es al l MY FAC E MY FACE ᵒHHH HOGE N O NO NOO̼O на θ STOP T он *̶͑̾̾ ̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨ E̠̅s ͎a̧͈͖r̽̾̈́͒͑en OT Rè̑ͧ̌aͨl̘̝̙ͤ̾̆ Za̡͊͠͝lg ͮ҉̯͈͕̹̘ o͇̹̺ɲ̴ȳ̳ th̘ ͖͖̉̉ ͠p̯͍̭o̚ n̐y̡ h̸̡̪̯ͨ͊̽̅̾ȩ̬̩̾͛ͪ̈͘ ̶̧̨̹̭̯ͧ̾ͬc̷̙̝͖ͭ̏ͥͮ͟oͮ͏̮̪̝͍m̖͊̒ͪͩͬ̚̚͜ȇ̴̟̟͙̞ͩ͌͝

0
20.05.2019, 03:12
2 ответа

Вы перенаправляете файл -дескриптор 3 в файл -дескриптор 1 , и вы перенаправляете 1 в /dev/null. Вы ничего не копируете.

Обычный способ скопировать файловый -дескриптор — tee.

Кроме того, я не знаю, какой у вас контекст, но 3 не является встроенным -файловым дескриптором. Предположительно, вы уже настроили его так, чтобы он на что-то указывал?

1
28.01.2020, 02:15

Ваши перенаправления делают делают FD 3 копией FD 1, поэтому FD 3 будет указывать на стандартный вывод, и все, что будет записано в него , по умолчанию пойдет в ()] Телетайп. Затем вы перенаправляете FD 1 на /dev/null, так что все, что записано в FD 1, будет отброшено. Поскольку grepникогда не записывает в FD 3, с ним ничего не происходит.

Это происходит последовательно :сначала делается копия(dup2)FD 1 в FD 3, так что FD 3 в дальнейшем указывает на то, на что в данный момент указывает FD 1, и, во-вторых, FD 1 заменяется указателем на /dev/null.

Конечный результат показан на следующей диаграмме:

Diagram of redirections 3>&1 1>/dev/null

Стандартная ошибка (розового цвета, FD 2 )и FD 3 относятся к TTY, а стандартный вывод — к /dev/null. FD 3 по-прежнему указывает на TTY, потому что именно на него указал FD 1, когда была сделана копия. Однако команда grepне будет пытаться ничего записать в FD 3, поэтому копия никогда не будет использована.

«Копирование» является направленным :после обработки 3>&1, все, что записывается в FD 3, будет направляться туда, куда указывал FD 1 во время обработки. Он не «сохраняет» ничего сверх этого :, если вы впоследствии перенаправите FD 1, все, что будет записано в него, попадет на новое место. То, что вы сделали, сохраняется в исходном месте назначения FD 1 на случай, если вы захотите использовать его позже. Единственное перенаправление, которое влияет на то, где заканчивается стандартный вывод grep, — это перенаправление 1>..., которое явно говорит о том, куда он идет.

Если быgrepбыло для записи в FD 3, оно появилось бы в терминале, как и ожидалось. Поскольку он обычно выводит только на FD 1, весь его фактический вывод отбрасывается.


Мы могли бы сделать вывод grep в FD 3, если бы захотели:

( grep "..." >&3 )

Это возьмет обычный вывод на FD 1 и направит его на (только что -созданный )FD 3. Это не сработает, если вы запустите его напрямую, потому что FD 3 никуда не денется,но мы можем включить его в нечто подобное этому, которое использует его:

( grep "..." >&3 ) 3>&1 1>/dev/null

Команда в круглых скобках выводит на FD 3. Последующие перенаправления 1 )указывают на FD 3 (, который теперь фактически содержит содержимое )на FD 1 и 2 ), а затем снова направляют FD 1 в сторону. (который не действует ). Конечным результатом является то, что вы снова получите вывод grep "..."на стандартный вывод именно там, где он был бы без всей суеты.

Практическое использование такого рода перенаправления что-то вроде

cmd 3>&1 1>&2 2>&3 3>&- | foo

, который меняет местами FD 1 и 2, используя FD 3 в качестве места временного хранения. Он также иногда используется для трюков сценария оболочки -, таких как имитация подстановки процесса в POSIX sh с помощью( cmd1 | ( cmd2 | ( main_command /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 ). В противном случае довольно редко команды изначально используют какой-либо нестандартный файловый дескриптор -по номеру (. Конечно, многие сами открывают файл и получают его ).

4
28.01.2020, 02:15

Теги

Похожие вопросы