有没有办法让我刚刚输入的命令在输入后回显到屏幕上?
前任:
$ echo hello
+ echo hello
hello
我知道可以这样做,bash -x
但我在 zsh 手册中找不到等效的内容。
答案1
-x
(或)选项也-o xtrace
适用zsh
。它来自 70 年代末的 Bourne shell,并受到所有类似 Bourne shell 的支持。从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
.
请注意,在交互式 shell 中,如果您启用了许多奇特的插件或高级完成功能,那么您还将看到与可能影响交互式 shell 体验的那些执行相对应的跟踪。
答案2
附录安迪道尔顿的正确答案,相对于威尔的评论......
我尝试过,但它导致我的终端输出一堆随机的东西,所以我认为这是不正确的。
对于 zsh,add-zsh-hook -d precmd update_terminal_cwd
可用于减少XTRACE
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
-d
Zsh 解决方法可以通过从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 )