На странице bash(1)
людей:
Каждая команда в конвейере выполняется как отдельный процесс (то есть, в субоболочке).
Поэтому cd
не может изменить рабочий каталог текущей оболочки при использовании в трубопроводе. Чтобы обойти это ограничение, обычный подход будет заключаться в группу cd
с другими командами и перенаправить вывод команды группы:
{
cd /usr/local/src
command1
command2
} | tee --append ~/max.log
Не нарушая существующий дизайн, вы могли бы вместо того, чтобы справиться с cd
специально в функции фильтра:
# eval all commands (will catch any cd output, but will not change directory):
eval $1 2>&1 >>~/max.log | tee --append ~/max.log
# if command starts with "cd ", execute it once more, but in the current shell:
[[ "$1" == cd\ * ]] && $1
в зависимости от ситуации, это может быть не достаточно: Вы, возможно, придется обрабатывать другие команды, которые изменяют среды или оболочки переменные, как set
, history
, ulimit
, read
, pushd
, и popd
также. В этом случае, вероятно, было бы хорошей идеей переосмыслить дизайн программы.
Что не работает? Он не записывается в каталог? – edi9999
cd не работает с трубами, 'папка cd | Например, ls' не поместит вас в «папку» – edi9999
Можете ли вы перевести функцию main на функцию и использовать 'tee' для выхода функции? Что-то вроде 'function mymain {...}' и 'mymain 2> & 1 | tee -append ~/max.log'? Или использовать что-то вроде 'script'? –