justingordon
justingordon

Reputation: 12913

In zsh function, how to echo a command

Related to this question on shell scripts and echoing command: In a shell script: echo shell commands as they are executed

I'd like to do something like this:

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

I tried this:

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

but that generates this extra ouput

+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

Is there any more elegant way to do this in a zsh function?

I'd like to do something like this:

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

and just echo the cmd being run (maybe with expansion of aliases).

Upvotes: 9

Views: 18137

Answers (2)

Jon Carter
Jon Carter

Reputation: 3436

setopt verbose

Put that wherever you want to start echoing commands as they are run, and when you don't want that behavior, use

unsetopt verbose

P.S. I realize this thread is too old to answer the original questioner, but wanted to help anyone who runs across this question in the future.

Upvotes: 15

justingordon
justingordon

Reputation: 12913

This worked for me. I defined this zsh function:

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

Then I run the command inside a function like this:

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

Any better option?

Upvotes: 3

Related Questions