С zsh
, да, не с bash
.
С zsh
:
cat file.in > file1.out > file2.out
или даже:
< file.in > file1.out > file2.out
(работает $NULLCMD
: cat
по умолчанию)
Обратите внимание, что cat
имеет только один стандартный вывод, в который он записывает содержимое file.in
. Выше stdout cat
представляет собой канал. И zsh
считывает этот вывод с другого конца, чтобы записать его как в file1.out
, так и в file2.out
.
Другими словами, здесь нет никакой магии, zsh
просто реализует tee
внутри.
Вы можете защитить попытку mv
, убедившись, что исходный файл существует, прежде чем пытаться переименовать его:
test -f /prod/new/outputlog/error.log &&
mv /prod/new/outputlog/error.log /prod/hist/new/outputlog/error.log.32423423424
Или вы можете перехватить сообщение об ошибке и попытаться разделить его на две строки:
mv /prod/new/outputlog/error.log /prod/hist/new/outputlog/error.log.32423423424 2>&1 |
fmt -s -w80 >&2
Вместо того, чтобы искажать сообщение об ошибке, просто проверьте перемещаемый файл перед его перемещением:
if [ -f /prod/new/outputlog/error.log ]; then
mv /prod/new/outputlog/error.log \
/prod/hist/new/outputlog/error.log.32423423424
fi
или с использованием логики короткого замыкания -:
[ -f /prod/new/outputlog/error.log ] &&
mv /prod/new/outputlog/error.log \
/prod/hist/new/outputlog/error.log.32423423424
Если отсутствие файла журнала является проблемой, о которой необходимо сообщить, сделайте это отдельно:
if [ -f /prod/new/outputlog/error.log ]; then
mv /prod/new/outputlog/error.log \
/prod/hist/new/outputlog/error.log.32423423424
else
echo 'ERROR: /prod/new/outputlog/error.log is missing' >&2
fi