Если вы хотите перенаправить как stdout, так и stderr в один и тот же файл, вы можете сделать это с помощью command 1>file.txt 2>&1
или command &>file.txt
. Но почему поведение command 1>file.txt 2>file.txt
отличается от двух приведенных выше команд?
Ниже приведена команда проверки.
$ cat redirect.sh
#!/bin/bash
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file.txt 2>&1
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file1.txt 2>file1.txt
{ echo -e "error" 1>&2 && echo -e "output\noutput"; } 1>file2.txt 2>file2.txt
{ echo -e "output" && echo -e "error\nerror" 1>&2; } 1>file3.txt 2>file3.txt
{ echo -e "error\nerror" 1>&2 && echo -e "output"; } 1>file4.txt 2>file4.txt
$ ./redirect.sh
$ echo "---file.txt---"; cat file.txt;\
echo "---file1.txt---"; cat file1.txt; \
echo "---file2.txt---"; cat file2.txt; \
echo "---file3.txt---"; cat file3.txt; \
echo "---file4.txt----"; cat file4.txt;
---file.txt---
output
output
error
---file1.txt---
error
output
---file2.txt---
output
output
---file3.txt---
error
error
---file4.txt----
output
rror
Что касается результатов, то похоже, что вторая строка эха перезаписывает первую строку эха при запуске command 1>file.txt 2>file.txt
, но я не знаю, почему это произойдет. (Есть ссылка где-нибудь?)
bash
shell
io-redirection
echo
fhiyo
источник
источник
Использование
>
говорит ему перезаписать файл. Так как stdout и stderr записывают в файл в двух разных операциях, последняя из них перезаписывает первую.Ты можешь сделать:
command 1>>file.txt 2>>file.txt
или
command &>file.txt
Только bash v4 и выше.>>
говорит ему добавить файл, чтобы он не заменил вывод предыдущих операций.&>
это просто более простой способ написать2>&1
источник
ls 1>&0
иls 0>&0
до сих пор показывает вывод ls?>>
работает. Почему в этом нет проблемы двух описаний файлов с независимыми смещениями? @JdeBP, ты знаешь? Я подумал, что открытие файла в режиме добавления эквивалентно открытию в режиме записи, поиску в конечной позиции, а затем запрету дальнейшего поиска.O_APPEND
.