
Есть ли способ, чтобы введенная мной команда отображалась на экране после ввода?
Бывший:
$ 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
из precmd
zsh-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 )