在zsh函数中,如何回显命令

jus*_*don 3 shell zsh

与shell脚本和echo命令有关的问题: 在shell脚本中:在执行shell命令时回显shell命令

我想做这样的事情:

foo() {
  cmd='ls -lt | head'
  echo $cmd
  eval ${cmd}
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个:

foo2() {
  set -x
  ls -lt | head
  set +x
}
Run Code Online (Sandbox Code Playgroud)

但这会产生额外的输出

+foo2:2> ls -G -lt
+foo2:2> head
total 136
drwxr-xr-x  18 justin  staff    612 Nov 19 10:10 spec
+foo2:3> set +x
Run Code Online (Sandbox Code Playgroud)

在zsh函数中,还有其他更优雅的方法吗?

我想做这样的事情:

foo() {
  cmd='ls -lt | head'
  eval -x ${cmd}
}
Run Code Online (Sandbox Code Playgroud)

并仅回显正在运行的cmd(也许使用别名扩展)。

Jon*_*ter 7

setopt verbose

将其放在要在运行时开始回显命令的位置,如果不希望出现这种情况,请使用

unsetopt verbose

PS:我意识到这个话题太老了,无法回答最初的提问者,但希望将来能帮助遇到此问题的任何人。


jus*_*don 3

这对我有用。我定义了这个 zsh 函数:

echoRun() {
  echo "> $1"
  eval $1
}
Run Code Online (Sandbox Code Playgroud)

然后我在这样的函数内运行命令:

foo() {
  echoRun "ls -lt | head"
}
Run Code Online (Sandbox Code Playgroud)

还有更好的选择吗?