С zsh
(и только zsh
) и его функцией multios
:
your-cmd 2> stdout+stderr.log >&2 2> stderr.log
Поскольку fd 2 перенаправляется дважды, zsh
реализует внутренний тройник
для отправки в оба файла.
В bash
(или любой другой оболочке типа Bourne) вы можете выполнить тройник
вручную с помощью:
{ your-cmd 2>&1 >&3 3>&- | tee stderr.log 3>&-; } > stderr+stdout.log 3>&1
(хотя вы потеряете статус выхода your-cmd
.zsh
находится в $pipestatus[1]
, bash
в "${PIPESTATUS[0]}"
(при условии, что перенаправление на stderr+stdout.log
не завершилось ошибкой)).
Чтобы записать pid your-cmd
, вы можете сделать:
{ sh -ec 'echo "$$" > /var/run/pidfile; exec your-cmd' 2>&1 >&3 3>&- |
tee stderr.log 3>&-; } > stderr+stdout.log 3>&1
С yash
и его перенаправлением процесса:
your-cmd > stdout+stderr.log 2>(tee stderr.log)
(но обратите внимание, что yash
не будет ждать завершения этой команды tee
, поэтому файлы журнала могут быть неполными к тому времени, когда вы выполните следующую команду после этого).
Нечто подобное (и с той же оговоркой) можно сделать с помощью замены процесса в bash
, zsh
и ksh93
:
{ your-cmd 2> >(tee stderr.log); } > stderr+stdout.log
Для запуска в фоновом режиме и получения pid:
(exec your-cmd 2> >(tee stderr.log)) > stderr+stdout.log & pid=$!
С rc
:
{your-cmd |[2=0] tee stderr.log} > stdout+stderr.log
каналы rc
позволяют указать, какие файловые дескрипторы подключены к каналу. В других оболочках это всегда fd 1 для левой команды и fd 0 для правой (отсюда небольшой танец с fd 3 выше для сдвига файловых дескрипторов). rc
сообщит об ошибке, если произойдет сбой либо your-cmd
, либо tee
, хотя точное число может быть потеряно.
Почему бы просто не подключиться по SSH к мощному ноутбуку, перенаправить X и использовать менее -мощную машину в качестве клавиатуры/монитора/мыши?
Запустите отдельные приложения или запустите новый X-сервер на своем локальном компьютере и установите его $DISPLAY
в качестве этого и запустите весь сеанс рабочего стола (, т.е.mate-session
)