` установить -x `отладка моего `.zshrc`

Я нашел кое-что, что работает хорошо:

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 секунды, а остановиться, как только буфер опустеет. Но лучшего способа я не знаю.

0
04.07.2020, 19:29
2 ответа

Если вы пытаетесь отладить скрипт , не используйте 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!
0
18.03.2021, 23:22

Оп здесь. я поместил следующие строки в свой.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✔% 
0
18.03.2021, 23:22

Теги

Похожие вопросы