Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In zsh function, how to echo a command

Tags:

shell

zsh

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).

like image 880
justingordon Avatar asked Nov 19 '13 21:11

justingordon


2 Answers

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.

like image 196
Jon Carter Avatar answered Oct 09 '22 14:10

Jon Carter


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?

like image 38
justingordon Avatar answered Oct 09 '22 13:10

justingordon