执行/ usr / bin / time时没有这样的文件或目录


11

我正在构建自己的android rom。为了构建它,我需要运行

mka -j8 bacon

但是,我想衡量构建它所花费的时间,所以我使用了

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon

这不会运行,因为这是在说

/usr/bin/time: cannot run mka: No such file or directory

任何帮助如何解决此问题,不胜感激!我正在运行xubuntu。

编辑:

由于某些原因,使用make代替mka确实可以,但是使用mka更好。

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon

编辑2:cyanogenmod网站

从外壳程序调用$ source build/envsetup.sh$ . build/envsetup.sh从外壳程序运行,在构建目录中运行envsetup.sh脚本。envsetup.sh向构建环境添加了许多功能,下面列出了其中最重要的功能。

source build/evnsetup.sh是我在执行时间之前运行的命令。evnsetup.sh所添加的功能之一是mka,是否可以在time命令中调用它?

编辑3:类型为mka的输出

$ type mka
mka is a function
mka () 
{ 
    case `uname -s` in 
        Darwin)
            make -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
        ;;
        *)
            schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
        ;;
    esac
}

您是否尝试放置mka的整个路径(例如/ usr / bin / mka)?
desgua 2014年

问题是evnsetup.sh初始化了一些东西。在终端中,我必须先执行该文件,然后才能调用mka。显然,从time命令将其作为参数调用时无法识别它。
P1nGu1n 2014年

我该如何重现?
Braiam 2014年

执行source build/evnsetup.sh完之后,在要调用的位置,您time mka -j8 bacon可以发布命令的输出type mka吗?
Malte Skoruppa 2014年

添加了@MalteSkoruppa输出,mka似乎是一个bash函数?
P1nGu1n 2014年

Answers:


11

问题在于mka脚本是由脚本导出的bash函数,而不是可执行文件(与相对make),因此/usr/bin/time找不到它,因为它正在寻找可执行文件。

有两种可能的解决方案。

首先,请注意,bash内置函数time和可执行文件之间存在差异/usr/bin/time。这些是不同的命令,它们采用不同的参数并生成不同的输出:

$ time sleep 1

real    0m1.001s
user    0m0.000s
sys     0m0.001s

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 664maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps

输入help time以获取内置bash的帮助time。键入man time以获取可执行文件的帮助/usr/bin/time

第一种解决方案使用time,而第二种解决方案使用/usr/bin/time

第一个解决方案:使用bash内置功能 time

bash内置函数time知道已声明的bash函数,您可以立即使用它来测量此类函数的时间。

$ foo() {
    sleep 1;
    echo "Hello World"
  }
$ time foo
Hello World

real    0m1.002s
user    0m0.000s
sys     0m0.001s

在您的情况下,以下命令应该起作用:

$ time mka -j8 bacon

这将是我的首选方式。但是,它可能无法完全生成所需的输出。特别是,它不会测量或打印CPU使用率。

第二种解决方案:使用可执行文件 /usr/bin/time

/usr/bin/time(据我所知)您不能直接测量内置bash函数的时间,但是您可以做的是测量/bin/bash可执行该bash函数的可执行文件的时间。这有点hacky,并且在启动额外的实例时会产生一些开销bash。但是,面对需要花费数分钟才能计算的功能时,此开销可以忽略不计,因此它仍然可能会更好地满足您的需求。

为了能够/bin/bash在bash函数上启动可执行文件,我们必须先导出该函数。

$ foo() {
    sleep 1;
    echo "Hello World"
  }
$ export -f foo
$ echo foo | /usr/bin/time /bin/bash
Hello World
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1476maxresident)k
0inputs+0outputs (0major+707minor)pagefaults 0swaps

因此,在您的情况下,要能够使用/usr/bin/time和生成所需的输出格式,可以按以下步骤进行:

$ export -f mka
$ echo 'mka -j8 bacon' | /usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" /bin/bash

谢谢,我真的很明白为什么它不起作用!两个简短的问题,-f参数是什么,我找不到。其次,/ bin / bash是什么?真的很感激!
P1nGu1n 2014年

1
-fexport告诉的参数export导出shell函数。请参阅help export-f/usr/bin/time告诉的参数需要/usr/bin/time一个格式字符串,但是我假设您知道这一点。/bin/bash最后一个命令的一部分是bash可执行文件,当它本身执行导出的mka功能时,其执行时间将被实际测量。mka之所以执行该函数,是因为它mka -j8 bacon从标准输入读取并执行命令,这就是我们使用echo管道的原因。抱歉,答案太晚了,请阅读此内容。:)
Malte Skoruppa 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.