Видимо, я не знаю всех выходных пунктов назначения, которые доступны для использования. Я знаю о stdout
( &1
) и stderr
( &2
). Однако, после перенаправления обоих дескрипторов, я иногда все еще получаю некоторый вывод в моей консоли!
Самый простой пример, который я могу вспомнить - это GNU Parallel; Каждый раз, когда я его использую, я вижу уведомление о цитировании. Даже когда я это делаю &2>1 > file
, я все равно вижу уведомление.
emerge
То же самое относится и к : когда я запускаю emerge и возникают некоторые проблемы, некоторые данные не печатаются stdout
ни на stdin
, так как я перенаправляю их, и они все еще проходят.
Я в основном решаю эти проблемы с помощью script
, но мне все еще интересно, что вызывает эту проблему.
bash
terminal
io-redirection
MatthewRock
источник
источник
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
отключит раздражающее сообщение. В качестве альтернативы, посмотрите на другие реализацииparallel
.parallel
в качестве примера.Ответы:
Синтаксис, который вы использовали, неверен.
будет разделен как
Это будет:
cmd
в качестве фонового задания без перенаправленийstderr
в файл, который называется буквально,1
и перенаправлениеstdout
вfile
Синтаксис, который вы хотите:
Порядок операций важен. Это будет:
stdout
наfile
stderr
на&1
- т.е. тот же файловый дескриптор, что иstdout
В результате оба
stderr
иstdout
будут перенаправлены наfile
.В
bash
более простом нестандартном (и поэтому я не рекомендую это из-за переносимости) синтаксисеcmd &> file
делает то же самое.источник
/dev/tty
, но, надеюсь, это случается не слишком часто (если вообще).at
команда на вашем компьютере и у вас есть права на ее использование, вы можете запустить команду черезat now
. Смотрите man-страницу для деталей. Это запустит команду через механизм пакетного процесса, и у процесса никогда не будет tty для записи. Но, в общем, я бы не беспокоился об этом крайнем случае. Обычно используются только процессы, требующие взаимодействия и намеренно нуждающиеся в отображении информации пользователям, несмотря на перенаправление/dev/tty
.Есть две проблемы.
Первое, что порядок имеет значение, второе
/dev/tty
.Давайте использовать этот сценарий в качестве примера сценария, из которого мы хотим получить выходные данные:
test.sh
:Теперь давайте посмотрим результаты команд:
./testmyscript.sh 2>&1 >/dev/null
:Поскольку порядок оценки слева направо, мы сначала получаем «перенаправление
stderr
туда, гдеstdout
выводится (то есть вывод на консоль)». Затем мы получаем «перенаправлениеstdout
на/dev/null
. Мы в конечном итоге в такой ситуации:stdout
->/dev/null
stderr
-> консольИтак, мы правильно поняли:
./testmyscript.sh >/dev/null 2>&1
И мы получаем:
ttdada
,Теперь мы делаем «Redirect
stdout
to/dev/null
», а затем «Redirect stderr туда, куда указывает stdout» (так,/dev/null
). Ура!Тем не менее, у нас все еще есть проблема; Программа печатает в
/dev/tty
. Сейчас я не знаю, как исправить такое поведение, поэтому вам, скорее всего, это понадобитсяscript
, но, надеюсь, такое поведение не будет происходить слишком часто.источник