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 -x
bash将在执行之前显示每个命令.
cnicutar@shell:~/dir$ set -x
cnicutar@shell:~/dir$ ls
+ ls --color=auto
a b c d e f
Run Code Online (Sandbox Code Playgroud)
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元字符的参数,并根据需要添加引号(这仍然不一定与您实际键入的引号相匹配).
可以将bash printf
与%q
格式说明符结合使用来转义参数,以便保留空格:
function echo_and_run {
echo "$" "$@"
eval $(printf '%q ' "$@") < /dev/tty
}
Run Code Online (Sandbox Code Playgroud)