执行 /usr/bin/time 时没有那个文件或目录

P1n*_*u1n 11 command-line bash time-command

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

mka -j8 bacon
Run Code Online (Sandbox Code Playgroud)

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

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon
Run Code Online (Sandbox Code Playgroud)

这不会运行,因为它说

/usr/bin/time: cannot run mka: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

编辑:

出于某种原因,使用 make 而不是 mka 确实有效,但是使用mka更好。

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon
Run Code Online (Sandbox Code Playgroud)

编辑 2: 来自cyanogenmod 网站

调用$ source build/envsetup.sh$ . build/envsetup.sh从您的 shell 运行构建目录中的 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
}
Run Code Online (Sandbox Code Playgroud)

Mal*_*ppa 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
Run Code Online (Sandbox Code Playgroud)

键入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
Run Code Online (Sandbox Code Playgroud)

在您的情况下,以下命令应该有效:

$ time mka -j8 bacon
Run Code Online (Sandbox Code Playgroud)

这将是我的首选方式。但是,它可能无法准确生成您想要的输出。特别是,它不测量或打印 CPU 使用率。

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

您不能使用/usr/bin/time(据我所知)直接测量内置 bash 函数的时间,但您可以做的是测量/bin/bash执行该 bash 函数的可执行文件的时间。这有点麻烦,当您启动一个额外的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
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,为了能够使用/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
Run Code Online (Sandbox Code Playgroud)