有没有办法以与内置时间相同的方式包装bash命令?

时间:2017-01-02 15:53:31

标签: bash

因此,bash内置的time可以time ls | sleep 2ls不仅仅是sleep 2,还有wrapit。本质上,它包括整个行,包括管道作为其参数。

我想这样做,但如果我定义一个函数说wrapit ls | sleep 2并调用wrapit,它会调用sleep 2并使用' ls'然后分开build.gradle。有没有办法定义一个函数,使得它将整个行的其余部分作为其参数?

我认为可能有一个使用some bash-preexec hacking的解决方案,但有很多问题需要解决。希望我错过了一些简单的东西。

2 个答案:

答案 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

这样,您可以将包装器用于管道,而不是仅使用简单命令。