Я новичок в bash и не могу на всю жизнь понять, как запустить определенную команду, предположить ./fff
и напечатать обычные stdouts перед stderr (я сам не понимаю смысла)
например
$ printf "I am a\ndrill\n" > fff;
$ cat fff nofile fff nofile fff
I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill
нужно напечатать как:
I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory
Я понимаю, что мне нужно сначала перенаправить вывод в файл, а затем добавить ошибку в тот же файл, однако это вывод, который я получаю для
$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see
I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory
cat
ли заменить «а» на «некоторые»?Ответы:
В любом случае вам нужно будет где-то держать вывод stderr, чтобы иметь возможность отображать его в конце.
Файл приходит на ум:
Или память (здесь используется
sponge
изmoreutils
):{...} 3>&1
: в{...}
дескрипторе файла (fd) 3 указывает на тот же ресурс, что и исходный стандартный вывод (так что мы можем использовать его для восстановления стандартного выводаfff
).fff <redirs> | sponge <redirs>
,fff
Иsponge
началась параллельно (с<redirs>
применяться независимо друг от друга) сfff
«ы стандартный вывод происходит в трубе, аsponge
» STDIN с будучи на другом конце трубы.2>&1
: fd 2 offff
(stderr) указывает на то же самое, что и на 1: канал в этой точке, поэтомуfff
ошибка идетsponge
через этот канал.>&3
: теперь стандартный вывод указывает на исходный стандартный вывод (перенаправьте обратно к тому, что было)3>&-
: закрываем fd 2, которыйfff
не нуженsponge
накапливает свои входные данные и только отображает их (на своем стандартном выводе, который был перенаправлен>&2
на тот же ресурс, что и stderr) после того, как он обнаружил eof на своем стандартном входе (предполагается, что онfff
завершается, и уже записал весь свой вывод на свой стандартный вывод).Если
sponge
не установлен, вы можете заменить его наperl -0777 -pe ''
. С-pe ''
,perl
читает одну запись за раз с ее ввода и записывает ее на стандартный вывод.-0777
является режимом slurp, где (только одна в этом случае) запись представляет собой весь ввод.источник
tee
вместоsponge
...?tee
не хранит данные, пишет их, как только читает.cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt
. (И вы , вероятно , не хочу , чтобы использовать>>
.) Кроме того , Stéphane делает отличную точку , что вы , вероятно , следует сделать ,cat ferr.txt >&2
чтобы записать информацию Stderr в стандартный поток ошибок.