Различные способы перенаправить stderr и stdout в файл в Bash? - PullRequest
1 голос
/ 15 мая 2019

Из того, что я понимаю, 2>&1 просто означает «отправить stderr в то же место, что и stdout».Но по какой-то причине 1>foo 2>foo и 1>foo 2>&1 не кажутся эквивалентными.

# Assuming file 'out' exists but file 'nosuchfile' doesn't

# 'foo' contains stdout and some partial stderr in CentOS 6
$ ls -l out nosuchfile 1>foo 2>foo
$ cat foo
-rw-r--r-- 1 user user 0 May 14 14:45 out
ctory

# 'foo' contains both stdout and stderr
$ ls -l out nosuchfile 1>foo 2>&1
$ cat foo
ls: cannot access nosuchfile: No such file or directory
-rw-r--r-- 1 user user 0 May 14 14:45 out

Может кто-нибудь объяснить, почему они ведут себя по-разному?

1 Ответ

0 голосов
/ 15 мая 2019

> перезаписывает файлы; >> добавляет к файлам.

Когда вы пишете 1> file и 2> file, оба потока будут перезаписывать file параллельно и поэтому могут перезаписывать друг друга - типичное условие гонки.

command 1>> file 2>> file должен сохранять все выходные данные обоих потоков.

Пример:

$ n=1""000""000
$ (seq "$n" 1>&2 & seq "$n") 1> o 2> o
$ wc -l o
1000000
$ rm o
$ (seq "$n" 1>&2 & seq "$n") 1>> o 2>> o
wc -l o
2000000
...