【问题标题】:Passing multiple commands to script calling time将多个命令传递给脚本调用时间
【发布时间】:2017-08-11 20:53:27
【问题描述】:

我有一个 bash 脚本,比如说 foo.sh,在这个最小的例子中看起来像这样:

#!/bin/bash
function __measure_time {
  time "$@"
}
__measure_time "$*"

我现在要做的是将两个命令传递给这个脚本,这些命令应该一个接一个地运行,我想测量时间。所以基本上我正在做类似的事情:

./foo.sh bash -c "echo 'ss' && sleep 1"

但这并不像我想要的那样工作。我没有从回声中得到“ss”,睡眠基本上被忽略了。有没有办法让这个工作?

【问题讨论】:

  • 对我来说这很好用。我对该命令所做的唯一编辑是在它前面加上'./'。所以应该是./foo.sh bash -c "echo ss && sleep 1"
  • 确实,看起来我得到的脚本比我想象的要复杂一行。我完全忽略了在调用时间之前有一个函数调用。它不是我的,但我正在尝试使用它。将添加代码。
  • 时间用于计时脚本的执行,而不是大量命令。也就是说,时间不会接受多个命令作为参数。
  • 我很清楚时间只需要一个参数。因此,我试图用 bash -c "..." 构造来欺骗它。然而,当通过所描述的脚本调用它时它不起作用,但当我在它自己的 shell 中运行它时完全没问题。我当然可以在脚本中编写这两个命令并随着时间的推移调用它,但希望避免有额外的文件

标签: bash parameter-passing timing


【解决方案1】:

如果你想让参数正确传递,你需要用"$@"而不是"$*"调用__measure_time

#!/bin/bash
__measure_time() { #why the `function` syntax when you can be POSIX?
  time "$@"
}
__measure_time "$@"

"$*"$IFS 的第一个字符上的所有参数连接成一个字符串。 "$@" 的魔力在于“给我所有的论点,就好像每个论点都被单独引用一样。”

【讨论】:

  • 谢谢。与 $@ 相比,使用 $* 有什么优势可以证明不替换它是合理的吗?
  • @FlyingTeller No
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2017-02-07
  • 2013-09-28
  • 2016-05-27
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多