Различие между 2> &-, 2>/dev/null, | и, и>/dev/null и>/dev/null 2> &1

Одно использование решения perl:

Содержание script.pl:

use warnings;
use strict;

## Acept one argumnet, the input file.
@ARGV == 1 or die qq[Usage: perl $0 input-file\n];

while ( <> ) {
        ## Remove last '\n' char.
        chomp;

        ## Split line with string 'ASDFASDF22'
        my @f = split /(ASDFASDF22)/;

        ## Print line but print first 49 chars plus a space of the special string.
        printf qq[%s%-50s%s\n],
                join( qq[], @f[0,1] ),
                substr( $f[2], 0, 49 ) . qq[ ],
                join( qq[], @f[3..$#f] );
}

Выполните сценарий:

perl script.pl infile

И вывод:

1653455 ASDFASDF22 bla bla bla asd xmv                              ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase          ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl w ASDFASDF22 BB
201
21.05.2014, 11:40
3 ответа

Для фона:

  • номер 1 = стандарт (т.е. STDOUT)
  • номер 2 = стандартная погрешность (т.е. STDERR)
  • если число не явно задано, то номер 1 принят оболочкой (удар)

Сначала давайте займемся функцией их. Поскольку ссылка видит Усовершенствованное Руководство по созданию сценариев Bash.

Функции

2>&-

Общая форма этого M>&-, где "M" является числом дескриптора файла. Это закроет вывод для того, какой бы ни на дескриптор файла ссылаются, т.е. "M".

2>/dev/null

Общая форма этого M>/dev/null, где "M" является числом дескриптора файла. Это перенаправит дескриптор файла, "M", к /dev/null.

2>&1

Общая форма этого M>&N, где "M" и "N" являются числами дескриптора файла. Это комбинирует вывод дескрипторов файлов "M" и "N" в единый поток.

|&

Это - просто сокращение для 2>&1 |. Это было добавлено в Bash 4.

&>/dev/null

Это - просто сокращение для >/dev/null 2>&1. Это перенаправляет дескриптор файла 2 (STDERR) и дескриптор 1 (STDOUT) к /dev/null.

>/dev/null

Это - просто сокращение для 1>/dev/null. Это перенаправляет дескриптор файла 1 (STDOUT) к /dev/null.

Мобильность, чтобы не колотить, tcsh, mksh, и т.д.

Я не имел дело очень с другими оболочками за пределами csh и tcsh. Мой опыт с теми 2 по сравнению с операторами перенаправления удара, то, что удар выше в том отношении. Дополнительную информацию см. в tcsh странице справочника.

Из команд Вы не спросили ни об одном, непосредственно поддерживаются csh/tcsh. Необходимо было бы использовать различные синтаксисы для построения подобных функций.

249
27.01.2020, 19:27
  • 1
    У Нас есть победитель. Но таким образом, нет никакого различия в производительности или некоторых такой с 2>&- по сравнению с 2>/dev/null (кроме этого не понимают некоторые "плохо" записанные программы 2>&- правильно)? –  Det 06.04.2013, 17:38
  • 2
    Не должно быть никакого различия в производительности. –  slm♦ 06.04.2013, 17:38
  • 3
    &> был в bash от запуска (и повреждения Bourne и совместимость POSIX, поскольку это означает что-то другое там, хотя вряд ли будет поражен). >& и |& произойдите из (t)csh (и это - их единственный способ перенаправить stderr). Они были в zsh от запуска и были только недавно добавлены к bash.См. также rc для лучше разработанных операторов. –  Stéphane Chazelas 24.10.2014, 12:26
  • 4
    Обновление: о проблеме производительности это также подтверждено здесь: unix.stackexchange.com/questions/163955 / … –  Det 16.04.2016, 17:24
  • 5
    Привет @slm, спасибо за контакт. Я рад, что мой repo не изменился (+2-2=0). Теперь, к части выпуска, я не редактирую много, но в этом случае я был бы, потому что она разъясняет, что данные после операции были бы в N. Я считал Вас ответ через, и он прекрасен очень во всех аспектах. Просто эта маленькая неоднозначность получила меня взгляды, именно поэтому выпуск. Но хорошо, не стесняйтесь повторно добавлять или отклонять его, как Вы будете. Я надеюсь, что мог объяснить идею.Так держать. –  Dr Beco 01.05.2017, 21:45

Это для перенаправления STDERR & STDOUT:

  • 2>/dev/null

    Перенаправьте STDERR к/dev/null (препятствуйте обнаружиться на консоли),

  • |&

    Перенаправьте STDERR и STDOUT к STDIN переданной по каналу команды (cmd1 | и cmd2)

  • &>/dev/null

    Перенаправьте обе STDERR & STDOUT к/dev/null (ничто не обнаруживается на консоли),

  • >/dev/null

    Перенаправьте STDOUT к/dev/null (только шоу STDERR на консоли)

  • 2>&-

    Для закрытия дескриптора файла, используемого с перенаправлением

Это все стандартные методы перенаправления для Оболочек Bourne.

12
27.01.2020, 19:27
  • 1
    |& и &>/dev/null не являются портативными. –  Chris Down 03.04.2013, 12:04

Считайте это дополнением к выбранному ответу. Вы можете захотеть узнать, какие формы соответствуют POSIX, а какие нет.

Задействованы две формы POSIX:

2.7.2 Redirecting Output

The two general formats for redirecting output are:

[n]>word

[n]>|word

where the optional n represents the file descriptor number. If the number is omitted, the redirection shall refer to standard output (file descriptor 1).

Output redirection using the '>' format shall fail if the noclobber option is set (see the description of set -C) and the file named by the expansion of word exists and is a regular file. Otherwise, redirection using the '>' or ">|" formats shall cause the file whose name results from the expansion of word to be created and opened for output on the designated file descriptor, or standard output if none is specified. If the file does not exist, it shall be created; otherwise, it shall be truncated to be an empty file after being opened.

-

2.7.6 Duplicating an Output File Descriptor

The redirection operator:

[n]>&word

shall duplicate one output file descriptor from another, or shall close one. If word evaluates to one or more digits, the file descriptor denoted by n, or standard output if n is not specified, shall be made to be a copy of the file descriptor denoted by word; if the digits in word do not represent a file descriptor already open for output, a redirection error shall result; see Consequences of Shell Errors. If word evaluates to '-', file descriptor n, or standard output if n is not specified, is closed. Attempts to close a file descriptor that is not open shall not constitute an error. If word evaluates to something else, the behavior is unspecified.

Поэтому:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

Последней строки нет в исходном вопросе, но в bash она работает без нареканий. (Также работает с заменой /dev/tty на /dev/null ).

8
27.01.2020, 19:27

Теги

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