先ほど入力したコマンドを入力した後、画面に再度表示させる方法はありますか?
前任者:
$ echo hello
+ echo hello
hello
私はこれが可能であることを知っていますが、bash -x
zshのマニュアルでそれに対応するものが見つかりません。
答え1
-x
(または)オプションも-o xtrace
適用されますzsh
。これは1970年代後半のBourneシェルに由来し、同様の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
付録Willのコメントに関連するAndy Daltonの正解...
試してみましたが、端末からランダムに複数の内容が出力され、誤った内容だと思いました。
zshの場合は、Apple端末アプリケーションで追跡の混乱を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 )