因此,bash内置的time
可以time ls | sleep 2
,ls
不仅仅是sleep 2
,还有wrapit
。本质上,它包括整个行,包括管道作为其参数。
我想这样做,但如果我定义一个函数说wrapit ls | sleep 2
并调用wrapit
,它会调用sleep 2
并使用' ls'然后分开build.gradle
。有没有办法定义一个函数,使得它将整个行的其余部分作为其参数?
我认为可能有一个使用some bash-preexec hacking的解决方案,但有很多问题需要解决。希望我错过了一些简单的东西。
答案 0 :(得分:2)
time
在技术上不是一个命令,而是一个管道修饰符(也就是说,它与|
的管道语法的一部分一样多),这就是为什么它能够以它的方式工作。使用函数,您可以做的最好的事情是将字符串作为单个参数传递,并使用eval
:
# Trivial example that is similar to eval alone
wrapit () {
eval "$1"
}
wrapit "ls | sleep 2"
答案 1 :(得分:2)
我一直使用函数包装器,我的经验是最佳实践方法是将管道包装在一个函数中。
# some random wrapper -- in this case, eliminating command output unless successful
emit_only_on_success() {
local output
output=$( "$@" ) && printf '%s\n' "$output"
}
myfunc() { ls | sleep 2; }
emit_only_on_success myfunc
这样,您可以将包装器用于管道,而不是仅使用简单命令。