Как понять порядок перенаправления вывода? [dубликат]

Если вы обнаружите ошибку при очистке пакета VSFTPD, вы можете вручную удалить его, выполнив следующие шаги:

Изменить на этот каталог

cd /var/lib/dpkg/info/      

Искать остаток файлы, здесь его vsftpd

ls | grep vsftpd            

Чтобы удалить файлы vsftpd

ls | grep vsftpd | xargs rm -i -f '{}'    

Второе местоположение

cd /var/cache/apt/archives/  
rm <vsftpd releated deb files >
sudo apt-get clean 
sudo apt-get autoremove
sudo apt-get update

Теперь начните установку своего любимого FTP-пакета. [ ! d5]

10
задан 24 September 2017 в 22:53

9 ответов

Порядок перенаправления значителен. Например, команда

ls > dirlist 2>&1

направляет как стандартный вывод, так и стандартную ошибку в файловый dirlist, а команда

ls 2>&1 > dirlist

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

Сначала это может показаться противоречивым, но, подумав об этом, мы может понять это.

Вы найдете это объяснение в man bash, в главе о перенаправлении,

REDIRECTION Прежде чем выполнить команду, ее ввод и вывод может быть перенаправлен с использованием специальной нотации, интерпретируемой оболочкой. Перенаправление позволяет копировать файлы команд, дублировать, открывать, закрывать, делать ссылки на разные файлы и изменять файлы, с которых команда считывает и записывает. Перенаправление также может использоваться для изменения файлов файлов в текущей среде выполнения оболочки. Следующие операторы перенаправления могут предшествовать или появляться в любой точке простой команды или могут следовать за командой. Перенаправления обрабатываются в том порядке, в котором они появляются, слева направо. Каждому перенаправлению, которому может предшествовать номер дескриптора файла, может предшествовать слово формы {varname}. В этом случае для каждого оператора перенаправления, кроме >&- и <&-, оболочка будет выделять файловый дескриптор, который больше или равен 10, и назначить его varname. Если перед >&- или <&- предшествует {varname}, значение varname определяет дескриптор файла для закрытия. В следующих описаниях, если номер дескриптора файла опущен, а первым символом оператора перенаправления является <, перенаправление относится к стандартному вводу (дескриптор файла 0). Если первым символом оператора перенаправления является >, перенаправление относится к стандартным выводам (дескриптор файла 1). Слово, следующее за оператором перенаправления в следующих описаниях, если не указано иначе, подвергается расширению скобки, расширению тильды, расширению параметров и переменных, замене команд, арифметическому расширению, удалению цитат, расширению пути и разбиению слов. Если он расширяется до более чем одного слова, bash сообщает об ошибке. Обратите внимание, что порядок перенаправления значителен. Например, команда
ls > dirlist 2>&1
направляет как стандартный вывод, так и стандартную ошибку в файл dirlist, тогда как команда
ls 2>&1 > dirlist
направляет только стандартный вывод в файл dirlist, поскольку стандартная ошибка дублируется со стандартного вывода до стандартный выход был перенаправлен на dirlist.

Порядок переназначений значителен

Подготовить

sudodus@xenial32:~$ touch qwerty;rm asdf
rm: cannot remove 'asdf': No such file or directory

Запустить команду списка для одного существующего файла и одного не- существующий файл

sudodus@xenial32:~$ ls qwerty asdf
ls: cannot access 'asdf': No such file or directory
qwerty

Перенаправить вывод ошибки перед перенаправлением стандартного вывода. Только стандартный вывод перенаправляется на выходной файл.

sudodus@xenial32:~$ ls qwerty asdf 2>&1 > output-file ;echo '---';cat output-file 
ls: cannot access 'asdf': No such file or directory
---
qwerty

Перенаправить вывод ошибки после перенаправления стандартного вывода. Как выход ошибки, так и стандартный вывод перенаправляются в выходной файл.

sudodus@xenial32:~$ ls qwerty asdf > output-file 2>&1 ;echo '---';cat output-file
---
ls: cannot access 'asdf': No such file or directory
qwerty

Маркер &> может использоваться для перенаправления стандартной ошибки и стандартного вывода. Он может использоваться в bash, но может быть недоступен в других оболочках.

sudodus@xenial32:~$ ls qwerty asdf &> output-file ;echo '---';cat output-file
---
ls: cannot access 'asdf': No such file or directory
qwerty
sudodus@xenial32:~$ 
5
ответ дан 22 May 2018 в 18:09
  • 1
    Пожалуйста, используйте только форматирование кода для текста, который является кодом (то есть не естественным языком) или что действительно требует сохранения белого пространства. Если вы хотите процитировать текстовые фрагменты, пожалуйста, отформатируйте их как кавычки блоков . Иначе +1. – David Foerster 24 September 2017 в 22:58
  • 2
    Например, если я перенаправляю 2 к 1, это больше похоже на перенаправление на то, на что в данный момент указано 1, и не «следовать» и т. Д. 1, если я перенаправляю 1 в другое место позже? Как перенаправить обратно на терминал и файл, например? – Aruka J 25 September 2017 в 00:47
  • 3
    Однако ваш последний комментарий запутан, но я опишу свой комментарий к тому, что, я думаю, вы имеете в виду. – jpezz 25 September 2017 в 03:35
  • 4
    Перенаправление применимо только для одной команды, поэтому следующая команда не будет перенаправлена. Групповые команды и окружать их круглыми скобками ПЕРЕД ПЕРЕЧИСЛЕНИЕМ, чтобы сделать вывод всех команд перенаправленными. Выход по умолчанию, если не перенаправлен, - это / dev / tty [всегда ваш терминал] в вашу оболочку. Чтобы сделать вывод, вы переходите в несколько мест, переместите команду на tee, которая отправит ее в указанный файл, а также на экран. "ls | tee outfile " посылает выход в трубу & amp; tee отправляет его на 2 места – jpezz 25 September 2017 в 03:42
  • 5
    Да, @ArukaJ, если я перенаправляю 2 к 1, это действительно перенаправляет на то, что 1 указывает на «в то время». – sudodus 25 September 2017 в 04:23

Порядок перенаправления значителен. Например, команда

ls > dirlist 2>&1

направляет как стандартный вывод, так и стандартную ошибку в файловый dirlist, а команда

ls 2>&1 > dirlist

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

Сначала это может показаться противоречивым, но, подумав об этом, мы может понять это.

Вы найдете это объяснение в man bash, в главе о перенаправлении,

REDIRECTION Прежде чем выполнить команду, ее ввод и вывод может быть перенаправлен с использованием специальной нотации, интерпретируемой оболочкой. Перенаправление позволяет копировать файлы команд, дублировать, открывать, закрывать, делать ссылки на разные файлы и изменять файлы, с которых команда считывает и записывает. Перенаправление также может использоваться для изменения файлов файлов в текущей среде выполнения оболочки. Следующие операторы перенаправления могут предшествовать или появляться в любой точке простой команды или могут следовать за командой. Перенаправления обрабатываются в том порядке, в котором они появляются, слева направо. Каждому перенаправлению, которому может предшествовать номер дескриптора файла, может предшествовать слово формы {varname}. В этом случае для каждого оператора перенаправления, кроме >&- и <&-, оболочка будет выделять файловый дескриптор, который больше или равен 10, и назначить его varname. Если перед >&- или <&- предшествует {varname}, значение varname определяет дескриптор файла для закрытия. В следующих описаниях, если номер дескриптора файла опущен, а первым символом оператора перенаправления является <, перенаправление относится к стандартному вводу (дескриптор файла 0). Если первым символом оператора перенаправления является >, перенаправление относится к стандартным выводам (дескриптор файла 1). Слово, следующее за оператором перенаправления в следующих описаниях, если не указано иначе, подвергается расширению скобки, расширению тильды, расширению параметров и переменных, замене команд, арифметическому расширению, удалению цитат, расширению пути и разбиению слов. Если он расширяется до более чем одного слова, bash сообщает об ошибке. Обратите внимание, что порядок перенаправления значителен. Например, команда ls > dirlist 2>&1 направляет как стандартный вывод, так и стандартную ошибку в файл dirlist, тогда как команда ls 2>&1 > dirlist направляет только стандартный вывод в файл dirlist, поскольку стандартная ошибка дублируется со стандартного вывода до стандартный выход был перенаправлен на dirlist.

Порядок переназначений значителен

Подготовить

sudodus@xenial32:~$ touch qwerty;rm asdf rm: cannot remove 'asdf': No such file or directory

Запустить команду списка для одного существующего файла и одного не- существующий файл

sudodus@xenial32:~$ ls qwerty asdf ls: cannot access 'asdf': No such file or directory qwerty

Перенаправить вывод ошибки перед перенаправлением стандартного вывода. Только стандартный вывод перенаправляется на выходной файл.

sudodus@xenial32:~$ ls qwerty asdf 2>&1 > output-file ;echo '---';cat output-file ls: cannot access 'asdf': No such file or directory --- qwerty

Перенаправить вывод ошибки после перенаправления стандартного вывода. Как выход ошибки, так и стандартный вывод перенаправляются в выходной файл.

sudodus@xenial32:~$ ls qwerty asdf > output-file 2>&1 ;echo '---';cat output-file --- ls: cannot access 'asdf': No such file or directory qwerty

Маркер &> может использоваться для перенаправления стандартной ошибки и стандартного вывода. Он может использоваться в bash, но может быть недоступен в других оболочках.

sudodus@xenial32:~$ ls qwerty asdf &> output-file ;echo '---';cat output-file --- ls: cannot access 'asdf': No such file or directory qwerty sudodus@xenial32:~$
5
ответ дан 18 July 2018 в 06:17

Порядок перенаправления значителен. Например, команда

ls > dirlist 2>&1

направляет как стандартный вывод, так и стандартную ошибку в файловый dirlist, а команда

ls 2>&1 > dirlist

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

Сначала это может показаться противоречивым, но, подумав об этом, мы может понять это.

Вы найдете это объяснение в man bash, в главе о перенаправлении,

REDIRECTION Прежде чем выполнить команду, ее ввод и вывод может быть перенаправлен с использованием специальной нотации, интерпретируемой оболочкой. Перенаправление позволяет копировать файлы команд, дублировать, открывать, закрывать, делать ссылки на разные файлы и изменять файлы, с которых команда считывает и записывает. Перенаправление также может использоваться для изменения файлов файлов в текущей среде выполнения оболочки. Следующие операторы перенаправления могут предшествовать или появляться в любой точке простой команды или могут следовать за командой. Перенаправления обрабатываются в том порядке, в котором они появляются, слева направо. Каждому перенаправлению, которому может предшествовать номер дескриптора файла, может предшествовать слово формы {varname}. В этом случае для каждого оператора перенаправления, кроме >&- и <&-, оболочка будет выделять файловый дескриптор, который больше или равен 10, и назначить его varname. Если перед >&- или <&- предшествует {varname}, значение varname определяет дескриптор файла для закрытия. В следующих описаниях, если номер дескриптора файла опущен, а первым символом оператора перенаправления является <, перенаправление относится к стандартному вводу (дескриптор файла 0). Если первым символом оператора перенаправления является >, перенаправление относится к стандартным выводам (дескриптор файла 1). Слово, следующее за оператором перенаправления в следующих описаниях, если не указано иначе, подвергается расширению скобки, расширению тильды, расширению параметров и переменных, замене команд, арифметическому расширению, удалению цитат, расширению пути и разбиению слов. Если он расширяется до более чем одного слова, bash сообщает об ошибке. Обратите внимание, что порядок перенаправления значителен. Например, команда ls > dirlist 2>&1 направляет как стандартный вывод, так и стандартную ошибку в файл dirlist, тогда как команда ls 2>&1 > dirlist направляет только стандартный вывод в файл dirlist, поскольку стандартная ошибка дублируется со стандартного вывода до стандартный выход был перенаправлен на dirlist.

Порядок переназначений значителен

Подготовить

sudodus@xenial32:~$ touch qwerty;rm asdf rm: cannot remove 'asdf': No such file or directory

Запустить команду списка для одного существующего файла и одного не- существующий файл

sudodus@xenial32:~$ ls qwerty asdf ls: cannot access 'asdf': No such file or directory qwerty

Перенаправить вывод ошибки перед перенаправлением стандартного вывода. Только стандартный вывод перенаправляется на выходной файл.

sudodus@xenial32:~$ ls qwerty asdf 2>&1 > output-file ;echo '---';cat output-file ls: cannot access 'asdf': No such file or directory --- qwerty

Перенаправить вывод ошибки после перенаправления стандартного вывода. Как выход ошибки, так и стандартный вывод перенаправляются в выходной файл.

sudodus@xenial32:~$ ls qwerty asdf > output-file 2>&1 ;echo '---';cat output-file --- ls: cannot access 'asdf': No such file or directory qwerty

Маркер &> может использоваться для перенаправления стандартной ошибки и стандартного вывода. Он может использоваться в bash, но может быть недоступен в других оболочках.

sudodus@xenial32:~$ ls qwerty asdf &> output-file ;echo '---';cat output-file --- ls: cannot access 'asdf': No such file or directory qwerty sudodus@xenial32:~$
5
ответ дан 24 July 2018 в 18:34
2>x означает, что имя файла x получит данные, записанные в дескриптор 2 (также известный как stderr, стандартная ошибка) ... но когда x указан как &1, это не означает «всегда следует 1»; это означает «скопировать текущие свойства 1 (а затем оставить его в покое)». Перенаправления применяются в том же порядке, что и в командной строке, но до фактического выполнения.

Вот почему 2>&1 1>whatever выводит stderr на терминал.

Вот почему find / -name mylostfile.txt 3>&1 1>&2 2>&3 | grep -v 'Permission denied' обменивает stderr и stderr, так что вы можете отфильтровать некоторые общие строки stderr, но все же видите все выходы. (Дескриптор 3 здесь не используется программами).

3
ответ дан 22 May 2018 в 18:09
  • 1
    Iow, он имеет семантику присваивания значения, а не ссылочную семантику. – JDługosz 25 September 2017 в 08:12

Среда встречает и устанавливает в порядке, в котором она видит вещь. В первом случае:

ls here.txt not-here.txt  1>out  2>&1

Выход перенаправляется, затем стандартная ошибка отправляется на одно и то же место.

Во втором случае

ls here.txt not-here.txt 2>&1 1>out

Стандартное выключение по-прежнему настроено на терминал, поэтому стандартная ошибка отправляется на терминал. Оболочка уже установила стандартную ошибку.

2
ответ дан 22 May 2018 в 18:09

Среда встречает и устанавливает в порядке, в котором она видит вещь. В первом случае:

ls here.txt not-here.txt 1>out 2>&1

Выход перенаправляется, затем стандартная ошибка отправляется на одно и то же место.

Во втором случае

ls here.txt not-here.txt 2>&1 1>out

Стандартное выключение по-прежнему установлено на терминал, поэтому стандартная ошибка отправляется на терминал. Оболочка уже установила стандартную ошибку.

2
ответ дан 18 July 2018 в 06:17
2>x означает, что имя файла x получит данные, записанные в дескриптор 2 (также известный как stderr, стандартная ошибка) ... но когда x указан как &1, это не означает «всегда следует 1»; это означает «скопировать текущие свойства 1 (а затем оставить его в покое)». Перенаправления применяются в том же порядке, что и в командной строке, но до фактического выполнения.

Вот почему 2>&1 1>whatever выводит stderr на терминал.

Вот почему find / -name mylostfile.txt 3>&1 1>&2 2>&3 | grep -v 'Permission denied' обменивает stderr и stderr, так что вы можете отфильтровать некоторые общие строки stderr, но все же видите все выходы. (Дескриптор 3 здесь не используется программами).

3
ответ дан 18 July 2018 в 06:17

Среда встречает и устанавливает в порядке, в котором она видит вещь. В первом случае:

ls here.txt not-here.txt 1>out 2>&1

Выход перенаправляется, затем стандартная ошибка отправляется на одно и то же место.

Во втором случае

ls here.txt not-here.txt 2>&1 1>out

Стандартное выключение по-прежнему настроено на терминал, поэтому стандартная ошибка отправляется на терминал. Оболочка уже установила стандартную ошибку.

2
ответ дан 24 July 2018 в 18:34
2>x означает, что имя файла x получит данные, записанные в дескриптор 2 (также известный как stderr, стандартная ошибка) ... но когда x указан как &1, это не означает «всегда следует 1»; это означает «скопировать текущие свойства 1 (а затем оставить его в покое)». Перенаправления применяются в том же порядке, что и в командной строке, но до фактического выполнения.

Вот почему 2>&1 1>whatever выводит stderr на терминал.

Вот почему find / -name mylostfile.txt 3>&1 1>&2 2>&3 | grep -v 'Permission denied' обменивает stderr и stderr, так что вы можете отфильтровать некоторые общие строки stderr, но все же видите все выходы. (Дескриптор 3 здесь не используется программами).

3
ответ дан 24 July 2018 в 18:34
  • 1
    Iow, он имеет семантику присваивания значения, а не ссылочную семантику. – JDługosz 25 September 2017 в 08:12

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

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