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

时间:2013-11-19 21:26:15

标签: shell zsh

与shell脚本和echoing命令相关的这个问题: In a shell script: echo shell commands as they are executed

我想做这样的事情:

foo() {
  cmd='ls -lt | head'
  echo $cmd
  eval ${cmd}
}

我试过了:

foo2() {
  set -x
  ls -lt | head
  set +x
}

但是会产生额外的输出

+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

在zsh函数中有更优雅的方法吗?

我想做这样的事情:

foo() {
  cmd='ls -lt | head'
  eval -x ${cmd}
}

只是回显正在运行的cmd(可能是扩展了别名)。

2 个答案:

答案 0 :(得分:4)

setopt verbose

将它放在您想要在运行时开始回显命令的任何地方,当您不想要这种行为时,请使用

unsetopt verbose

P.S。我意识到这个帖子太旧了,无法回答最初的提问者,但是希望能帮助那些在将来遇到这个问题的人。

答案 1 :(得分:2)

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

echoRun() {
  echo "> $1"
  eval $1
}

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

foo() {
  echoRun "ls -lt | head"
}

还有更好的选择吗?