Эквивалент bash -x для zsh

Эквивалент bash -x для zsh

Есть ли способ, чтобы введенная мной команда отображалась на экране после ввода?

Бывший:

$ echo hello
+ echo hello
hello

Я знаю, что это можно сделать, bash -xно я не смог найти эквивалента в руководстве по zsh.

решение1

Параметр -x(или -o xtrace) тоже работает zsh. Он появился в оболочке Bourne в конце 70-х и поддерживается всеми оболочками, подобными Bourne. Из man zshoptions/ info zsh xtrace:

XTRACE (-x, ksh: -x)
    Print commands and their arguments as they are executed.  The
    output is preceded by the value of $PS4, formatted as described
    in the section EXPANSION OF PROMPT SEQUENCES in zshmisc(1).

Пример:

#!/bin/zsh -x

echo hello

и пример запуска:

$ /tmp/ex.sh
+/tmp/ex.sh:3> echo hello
hello

Как и в bash/ ksh, его можно включить с помощью set -xили set -o xtraceи отключить впоследствии с помощью set +xили set +o xtrace. Также можно включить трассировку на основе функции с помощью functions -t myfunction.

Помните, что в интерактивных оболочках, если вы включили ряд дополнительных плагинов или расширенное автодополнение, вы также увидите трассировку, соответствующую выполнению тех из них, которые могут повлиять на работу интерактивной оболочки.

решение2

Добавлен правильный ответ Энди Далтона относительно комментария Уилла…

Я попробовал, но мой терминал вывел кучу случайных данных, поэтому я предположил, что это неправильно.

Для zsh add-zsh-hook -d precmd update_terminal_cwdможно использовать для уменьшения XTRACEбеспорядка в трассировке в приложении Терминал от Apple.

TL;DR

В случае с приложением «Терминал» от Apple есть дополнение, update_terminal_cwd()которое запускается при каждом обновлении запроса.

Вызов update_terminal_cwdтакже отображается в команде «set -x» и загромождает ее XTRACE.

username@hostname ~ % echo hello
# +-zsh:2> echo hello
# hello
# +update_terminal_cwd:5> local url_path=''                                                                                         
# +update_terminal_cwd:10> local i ch hexch LC_CTYPE=C LC_COLLATE=C LC_ALL='' LANG=''
# +update_terminal_cwd:11> i = 1
# 
# … <snip>
# 
# +update_terminal_cwd:22> printf '\e]7;%s\a' #file://hostname.local/Users/username

/etc/bashrc_Apple_Terminal

update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.

# … <snip>

printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}
PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

Обходной путь Bash: unset PROMPT_COMMANDили измените PROMPT_COMMANDтак, чтобы не использовать update_terminal_cwd.

/etc/zhrc_Apple_Terminal

update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.

    # Percent-encode the pathname.
    local url_path=''
    {
      # … <snip>
    }

printf '\e]7;%s\a' "file://$HOST$url_path"
}

# Register the function so it is called at each prompt.
autoload -Uz add-zsh-hook
add-zsh-hook precmd update_terminal_cwd

Обойти проблему Zsh можно, удалив -dиз precmdzsh-hook:

### `-L` list
user@host ~ % add-zsh-hook -L
# typeset -g -a zshexit_functions=( shell_session_update )
# typeset -g -a precmd_functions=( update_terminal_cwd )

user@host ~ % add-zsh-hook -d precmd update_terminal_cwd

user@host ~ % add-zsh-hook -L                           
# typeset -g -a zshexit_functions=( shell_session_update )

user@host ~ % set -x
user@host ~ % echo hello
# +-zsh:8> echo hello
# hello

user@host ~ % set +x; add-zsh-hook -L
# typeset -g -a zshexit_functions=( shell_session_update )

Связанный контент