Я нашел кое-что, что работает хорошо:
exec 3<> <(:)
var3=$(command1 | tee >(command2 >&3) | command3)
var2=$(while IFS= read -t.01 -r -u 3 line; do printf '%s\n' "$line"; done)
Он работает, устанавливая анонимный канал <(:)
в файл -дескриптор 3 и направляя в него вывод command2
. var3
фиксирует вывод command3
, а последняя строка считывает файл -с дескриптором 3 до тех пор, пока не перестанет получать новые данные в течение 0,01 секунды.
Это работает только для вывода до 65536 байтов command2
, которые, кажется, буферизуются анонимным каналом.
Мне не нравится последняя строка решения. Я бы предпочел прочитать все сразу и не ждать 0,01 секунды, а остановиться, как только буфер опустеет. Но лучшего способа я не знаю.
Если вы пытаетесь отладить скрипт , не используйте set -x
на терминале (, который отлаживает оболочку, работающую в терминале ). Вместо этого вы можете запустить скрипт с опцией -x
для интерпретатора (, например,zsh -x <scriptname> [<args>]
).
Если, например, у вас есть zsh-скрипт с именем ex.zsh
, вы можете сделать:
$ cat /tmp/ex.zsh
#!/bin/zsh
function () {
echo "Hello, world!"
}
$ zsh -x /tmp/ex.zsh
+/tmp/ex.zsh:3> '(anon)'
+(anon):1> echo 'Hello, world!'
Hello, world!
Оп здесь. я поместил следующие строки в свой.zshrc
alias debugOn='DEBUGCLI=YES exec zsh'
alias debugOff='DEBUGCLI=NO exec zsh'
if [[ $DEBUGCLI == "YES" ]]
then
export PS1="%F{013}%2~%f%(?.%F{004}.%F{001}✕%?)%# %f"
else
. ~/zshfiles/zsh-git-prompt.zsh
export PS1="%F{013}%2~%f$(git_super_status)%(?.%F{004}.%F{001}✕%?)%# %f"
fi
Теперь это работает следующим образом:
Documents/check:master✔% debugOn
Documents/check% set -xv
Documents/check% echo "Debugging Line"
echo "Debugging Line"
+zsh:3> echo 'Debugging Line'
Debugging Line
Documents/check% set +xv
set +xv
+zsh:4> set +xv
Documents/check% debugOff
Documents/check:master✔%