Echo命令,然后运行它?(喜欢制作)

mjs*_*mjs 17 bash shell makefile echo

有没有办法让bash进入一种冗长的模式,这样,当它运行一个shell脚本时,它会在运行它之前回显它将要运行的命令?也就是说,以便它可以看到已运行的命令(以及它们的输出),类似的输出make

也就是说,如果运行shell脚本就好

echo "Hello, World"
Run Code Online (Sandbox Code Playgroud)

我想要以下输出

echo "Hello, World"
Hello, World
Run Code Online (Sandbox Code Playgroud)

或者,是否可以编写一个调用的bash函数echo_and_run来输出命令然后运行它?

$ echo_and_run echo "Hello, World"
echo "Hello, World"
Hello, World
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 31

您可以echo在调用之前为命令创建自己的函数eval.

Bash还有一个调试功能.一旦你set -xbash将在执行之前显示每个命令.

cnicutar@shell:~/dir$ set -x
cnicutar@shell:~/dir$ ls
+ ls --color=auto
a  b  c  d  e  f
Run Code Online (Sandbox Code Playgroud)

  • 你也可以做`(set -x; ls; echo blah)`这在某些情况下可能会有所帮助.(当子shell退出时,`set -x`将被恢复.) (4认同)
  • @mjs:如果你想要脚本的整个运行时命令echo-ing,你可以通过`bash -x`运行它(它隐式启用`set -x`并且不输出它). (3认同)

Kei*_*son 17

要回答你问题的第二部分,这里有一个shell函数可以做你想要的:

echo_and_run() { echo "$*" ; "$@" ; }
Run Code Online (Sandbox Code Playgroud)

我使用类似的东西:

echo_and_run() { echo "\$ $*" ; "$@" ; }
Run Code Online (Sandbox Code Playgroud)

$在命令前打印(它看起来像一个shell提示符,并且更清楚它是一个命令).当我想要显示它正在执行的一些(但不是全部)命令时,我有时会在脚本中使用它.

正如其他人提到的,它确实失去了引号:

$ echo_and_run echo "Hello, world"
$ echo Hello, world
Hello, world
$ 
Run Code Online (Sandbox Code Playgroud)

但我认为没有任何好办法可以避免这种情况; 在echo_and_run获得有机会看到它们之前,shell会引用引号.您可以编写一个脚本来检查包含空格和其他shell元字符的参数,并根据需要添加引号(这仍然不一定与您实际键入的引号相匹配).


mjs*_*mjs 7

可以将bash printf%q格式说明符结合使用来转义参数,以便保留空格:

function echo_and_run {
  echo "$" "$@"
  eval $(printf '%q ' "$@") < /dev/tty
}
Run Code Online (Sandbox Code Playgroud)