你如何在bash中编写一个函数来执行它作为参数给出的命令,其中
换句话说,如何编写尽可能透明的包装函数.
包装函数的目标可以是例如在给定命令之前和之后设置当前目录,和/或设置环境变量,或者给定命令花费多长时间,...作为一个简单的例子,我在这里采取一个函数只打印一行然后执行给定的命令.
第一次尝试:
function wrap1 {
echo Starting: "$@"
"$@"
}
Run Code Online (Sandbox Code Playgroud)
你可以像使用它一样wrap1 echo hello.但问题是你不能做alias myalias echo,然后调用wrap1 myalias hello:它不会解决别名.
另一种尝试使用eval:
function wrap2 {
echo Starting: "$@"
eval "$@"
}
Run Code Online (Sandbox Code Playgroud)
现在调用别名有效.但问题是它也会对参数进行评估.例如,wrap2 echo "\\a"打印a而不是\a因为参数被评估两次.
shopt -s expand_aliases 这似乎也没有帮助.
有没有办法同时评估像wrap2这样的别名,但仍然像wrap1一样直接传递参数?
你(呃,我)可以使用printf%q来转义参数.乍一看,使用printf转义然后执行eval总是会产生与直接传递参数相同的结果.
wrap() {
echo Starting: "$@"
eval $(printf "%q " "$@")
}
Run Code Online (Sandbox Code Playgroud)