В чем различия между &> и 2> & 1

Существует две формы перенаправления стандартного выхода и стандартной ошибки на стандартный выход . Но какой из них лучше? и почему &> считается идеальным?

Я не могу найти, в чем различия, так что многие учебники и даже руководство по bash утверждают, что &> лучше!

Так почему я должен использовать &>, а не 2>&1

В основном использовать bash оболочку


РЕДАКТИРОВАТЬ: Спасибо за комментарии

Только> & работает в csh или tcsh

В ksh работает только 2> & 1.

dash use> file 2> & 1 redirection redirection

Тогда какой из них использовать для обеспечения совместимости моего скрипта с другими системами, какими бы ни были используемые оболочки!

30
задан 11 June 2015 в 14:02

4 ответа

Страница справочника Bash упоминает, что существует два способа перенаправить stderr и stdout: &> file и >& file. Теперь, заметьте, что это говорит и stderr и stdout.

В случае этого >file 2>&1 мы делаем перенаправление stdout (1) в файл, но тогда также говорим stderr (2) быть перенаправленным к тому же месту как stdout! Таким образом, целью может быть то же, но немного отличающаяся идея. Другими словами, "John, пойдите в школу; Suzzie идут, куда John идет".

Что относительно предпочтения? &> bash вещь. Таким образом, при портировании сценария так не пойдет он. Но если Вы на 100% уверены, что Ваш сценарий будет только работать над системой с ударом - тогда нет никакого предпочтения

, Вот пример с dash, Shell Debian Amquist, который является значением по умолчанию Ubuntu.

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

, Как Вы видите, stderr не перенаправляется

Для обращения к редактированиям в вопросе, можно использовать, если оператор для проверки переменной $SHELL и изменения перенаправляет соответственно

, Но для большинства случаев > file 2>&1 должен работать

<час>

В большем количестве технических терминов, форму [integer]>&word называют Дескриптор Выходного файла Дублирования и является функцией, определенной POSIX стандарт Командного языка Shell, который поддерживается большинством совместимых POSIX и подобных Brourne оболочек.

Видят также , Что делает & иметь в виду точно в перенаправлении вывода?

0
ответ дан 11 June 2015 в 14:02

Из Справочника Bash-> 3.6.4 Стандартных выводов Перенаправления и Стандартная погрешность:

Эта конструкция позволяет обоим стандартный вывод (дескриптор файла 1) и вывод стандартной погрешности (дескриптор файла 2), чтобы быть перенаправленной в файл, имя которого является расширением слова.

Существует два формата для перенаправления стандартного вывода и стандартной погрешности:

&>word

и

>&word

Из двух форм предпочтено первое. Это семантически эквивалентно

>word 2>&1

При использовании второй формы слово не может расшириться до числа или ‘-’. Если это делает, другие операторы перенаправления применяются (см. Дескрипторы файлов Дублирования ниже) по причинам совместимости.

Также хороший для обращения к Wiki Greg на Вводе и выводе-> 4.2. Управление Дескриптором файла:

Для удобства Bash также делает еще одну форму к перенаправлению доступной для Вас. И> оператор перенаправления является на самом деле просто более короткой версией того, что мы сделали здесь [ 2>&1 ]; перенаправление и stdout и stderr в файл.

4
ответ дан 11 June 2015 в 14:02

Итак, почему буду, я использую &> и не 2> & 1

2>&1 стандартная оболочка Границы/POSIX.

&> расширение удара а не де-юре стандарт.

, Если Вы пишете сценарии с помощью расширений удара, рано или поздно Вы собираетесь встретиться с царапающими голову отказами с загадочными сообщениями синтаксической ошибки, потому что они выполняются в стандартной оболочке.

0
ответ дан 12 June 2015 в 00:02
  • 1
    Вопрос состоял в том, как получить окно терминала. – Pilot6 9 September 2016 в 07:36

Я обычно рекомендовал бы после Оболочки Границы снова способу сделать вещи, так как удар является возможно самой популярной оболочкой Unix там. Bash обычно использует также &> или 2>&1. По моему скромному мнению, ни один не "прекрасен", таким образом, я рекомендую забыть о той ерунде. Реалистично, который, который необходимо использовать, зависит от того, что Вы пытаетесь сделать.

2>&1 слияния stderr с stdout, который может быть полезным, если, например, Вы хотите передать stderr текст по каналу. Так, например, если Вы хотите видеть, печатает ли программа определенное сообщение stderr, но не хотят Ваш экран, заполненный (по-видимому), неважным мусором, Вы могли сделать что-то как program 2>&1 | grep crashed, который будет искать stdout и stderr из программы, названной "программой" для "разрушенного" слова.

С другой стороны, если Вы не хотите, чтобы программа распечатала что-нибудь вообще, Вы могли бы просто работать program &> /dev/null, который перенаправит и stderr и stdout к/dev/null, специальный файл, который волшебно заставляет вещи исчезнуть. Или, если Вы хотите сохранить вывод программы (возможно, для сообщения об ошибке или чем-то), Вы могли перенаправить и stderr и stdout в файл: program &> log.txt перенаправит все данные в файл под названием "log.txt". Если бы Вы хотели, то Вы могли бы перенаправить stdout и stderr через program 2> log.txt > log.txt или program 2>&1 | cat > log.txt, оба из которых имели бы тот же эффект как использование &>. Если Вы делаете что-то как program 2>&1 > file, только stdout будет перенаправлен, но stderr может все еще быть передан по каналу к другой программе, такой как кошка, которая могла быть перенаправлена как показано выше. Однако ввод &> легче, чем любой из вышеупомянутых примеров, начиная с него включает ввод меньшего количества символов (и для людей немного легче читать). Действительно отметьте это program 2> log.txt > log.txt могло бы быть более вероятно работать над оболочками неудара.

PS: если Вы волнуетесь по поводу людей, использующих другие оболочки, существует что-то, что можно добавить, чтобы быть первой строкой сценария, названного "магическим числом" или "хижиной". Это - по существу способ удостовериться, что другие компьютеры (особенно те, которые выполняют подобные Unix операционные системы), знают который программа использовать для выполнения сценария. Различные сценарии используют различные хижины. Хижина для сценария удара похожа на это:

#!/bin/bash

Если Вы будете использовать вышеупомянутое в качестве первой строки данного сценария, то удар будет обычно использоваться для выполнения было, сказано в сценарии. Это сделает намного более трудным для кого-то случайно выполнить сценарий с неправильной оболочкой.

PS: я не собираюсь лежать: до настоящего времени я не знал, что можно было использовать >&, но, насколько удар идет, это, кажется, делает то же как &>. Вы каждый день изучаете что-то новое.

6
ответ дан 12 June 2015 в 00:02
  • 1
    Введите команду в моем ответе в окне терминала. Тогда, поскольку в ответе говорится, запуск playonlinux от launch кнопка. Это даст графический интерфейс только после подсказок. Все остальное является бесшовным и автоматическим. Можно сделать это для многих Windows-программ. Это работает очень хорошо на Photoshop. – L. D. James 9 September 2016 в 07:29

Другие вопросы по тегам:

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