我正在尝试编写一个函数,该函数将两个命令作为输入,对这两个命令的执行进行计时,然后将这些时间输出到文本文件。看完之后这个帖子,我已经完成了大部分工作,并且可以一次将我的执行时间写入一个文件。我现在遇到的问题是让函数接受两个多字输入。我当前的代码如下所示:
timeDiff () {
{ time "$1" ; } 2> ~/file.txt
{ time "$2" ; } 2>> ~/file.txt
}
如果我使用我想要的函数顺序运行这些行,一切都很好。该文件将被两个函数的时间信息覆盖。以下是我对此的一些尝试和问题:
timeDiff grep "str" file1 query database lookup.sql
这将导致我的文件有时会出现有关 grep 的警告,并且会出现bash: str: command not found
.
timeDiff 'grep "str" file1' 'query database lookup.sql'
这将导致我的文件有时出现 bash:grep "str" file1: No such file or directory 和 bash:query database Lookup.sql: No such file or directory。
我认为这与我的 grep 需要引号有关,但也许有更好的方法来编写函数的输入。我是初学者,所以我很想学习!谢谢!
答案1
和:
{ time "$1" ; } 2> ~/file.txt
bash
对于像这样具有time
关键字的shell ,您可以使用time
关键字来计算 shell 代码的计算时间"$1"
。"$1"
是执行命令的代码,其名称位于函数的第一个位置参数中:
和:
timeDiff grep "str" file1 query database lookup.sql
您正在调用timeDiff
作为grep
第一个参数和str
第二个参数(以及file1
第三个参数等)
因此,time "$1"
将计算不带参数调用的命令的执行时间grep
。grep
需要至少一个参数,所以会抱怨。
在
timeDiff 'grep "str" file1' 'query database lookup.sql'
这次$1
会,grep "str" file1
但不太可能有一个名为该名称的命令。
您想要的似乎是对第一个和第二个参数中传递的 shell 代码的评估进行计时,如下所示:
timeDiff () {
time eval " $1"
time eval " $2"
} 2> ~/file.txt
或者可能:
timeDiff () {
eval "time {
$1
}"
eval "time {
$2
}
} 2> ~/file.txt
评估由以下内容组成的 shell 代码:
time {
contents-of-$1
}
对命令组进行计时,该命令组的主体是第一个位置参数的内容。
还要注意的是:
{ time cmd; } 2> file
计时将结束file
,但也会出现错误cmd
(以及 shell 无法运行的错误(cmd
如果有的话))。
要得到仅有的的时间file
,你需要这样的东西:
{ time cmd 2>&3 3>&-; } 3>&2 2> file
答案2
timeDiff grep "str" file1 query database lookup.sql
将使 $1=grep 和 $2=str
timeDiff 'grep "str" file1' 'query database lookup.sql'
将使 $1 成为字符串“grep“str”file1”,因此它会查找名为的文件
./grep_"str"_file1
其中_是空格字符:没有这样的文件。
你需要使用 bash评估函数将字符串转换为可执行的命令行语句。
但要小心他们说“评估是邪恶的”是有原因的:)