Không có tệp hoặc thư mục như vậy khi thực hiện / usr / bin / time


11

Tôi đang xây dựng rom android của riêng mình. Để xây dựng nó, tôi cần phải chạy

mka -j8 bacon

Tuy nhiên, tôi muốn đo thời gian xây dựng nó, vì vậy tôi đã sử dụng

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

Điều này sẽ không chạy, bởi vì nó nói

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

Bất kỳ trợ giúp làm thế nào để làm việc này, nó được đánh giá cao! Tôi đang chạy xubfox.

Biên tập:

Vì một số lý do, sử dụng make thay vì mka không hoạt động, tuy nhiên sử dụng mka thì tốt hơn.

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

Chỉnh sửa 2: từ trang web cyanogenmod

Gọi $ source build/envsetup.shhoặc $ . build/envsetup.shtừ shell của bạn chạy tập lệnh envsetup.sh trong thư mục build. envsetup.sh thêm nhiều chức năng vào môi trường xây dựng, trong đó quan trọng nhất được liệt kê dưới đây.

source build/evnsetup.shlà lệnh tôi chạy trước khi thực hiện thời gian. Một trong những chức năng được thêm bởi evnsetup.sh là mka, có thể gọi hàm này từ bên trong timelệnh không?

Chỉnh sửa 3: Đầu ra của loại 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
}

Bạn đã thử đặt toàn bộ đường dẫn của mka (đại loại như / usr / bin / mka) chưa?
desgua

Vấn đề là evnsetup.sh khởi tạo một số thứ. Trong terminal tôi phải thực thi tập tin đó trước khi tôi có thể gọi mka. Rõ ràng nó không được nhận ra khi gọi nó là một tham số từ lệnh thời gian.
P1nGu1n

Làm thế nào tôi có thể tái tạo điều này?
Braiam

Sau khi bạn thực hiện lệnh của mình source build/evnsetup.sh, tại điểm bạn muốn gọi time mka -j8 bacon, bạn có thể đăng đầu ra của lệnh type mkakhông?
Malte Skoruppa

@MalteSkoruppa đầu ra được thêm vào, mka dường như là một hàm bash?
P1nGu1n

Câu trả lời:


11

Vấn đề là đó mkalà một hàm bash được xuất bởi tập lệnh của bạn chứ không phải là tệp thực thi (trái ngược với make), vì vậy /usr/bin/timekhông tìm thấy nó, vì nó tìm kiếm một tệp thực thi.

Đây là hai phương pháp khả thi.

Đầu tiên, lưu ý rằng có một sự khác biệt giữa hàm tích hợp bash timevà hàm thực thi /usr/bin/time. Đây là các lệnh khác nhau, nhận các tham số khác nhau và tạo đầu ra khác nhau:

$ 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

Nhập help timeđể nhận trợ giúp cho bash tích hợp time. Nhập man timeđể nhận trợ giúp cho việc thực thi /usr/bin/time.

Giải pháp đầu tiên sử dụng time, trong khi giải pháp thứ hai sử dụng /usr/bin/time.

Giải pháp đầu tiên: sử dụng hàm tích hợp bash time

Hàm tích hợp bash timenhận biết các hàm bash được khai báo và bạn có thể sử dụng ngay lập tức để đo thời gian của các hàm đó.

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

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

Trong trường hợp của bạn, lệnh sau sẽ hoạt động:

$ time mka -j8 bacon

Đây sẽ là cách ưa thích của tôi. Tuy nhiên, nó có thể không tạo ra chính xác đầu ra mà bạn muốn. Cụ thể, nó không đo hoặc in mức sử dụng CPU.

Giải pháp thứ hai: sử dụng tệp thực thi /usr/bin/time

Bạn không thể đo trực tiếp thời gian của hàm bash tích hợp bằng cách sử dụng /usr/bin/time(theo như tôi biết), nhưng điều bạn có thể làm là đo thời gian /bin/bashthực thi hàm bash đó. Đây là một chút hacky, và nó tạo ra một chút chi phí khi bạn đang khởi chạy một ví dụ bổ sung bash. Nhưng chi phí này có thể không đáng kể khi phải đối mặt với một hàm mất vài phút để tính toán, vì vậy nó vẫn có thể phù hợp với nhu cầu của bạn hơn.

Để có thể khởi chạy /bin/bashtệp thực thi trên hàm bash, trước tiên chúng ta phải xuất hàm.

$ 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

Do đó, trong trường hợp của bạn, để có thể sử dụng /usr/bin/timevà tạo định dạng đầu ra mà bạn muốn, bạn có thể tiến hành như sau:

$ 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

Cảm ơn bạn, tôi thực sự hiểu lý do tại sao nó không hoạt động! Hai câu hỏi ngắn, -ftham số là gì, tôi không thể tìm thấy điều này. Thứ hai, cái gì / bin / bash? Thực sự đánh giá cao nó!
P1nGu1n

1
Các -ftham số để exportnói exportđến xuất khẩu một chức năng vỏ. Xem help export. Các -ftham số để /usr/bin/timenói /usr/bin/timeđể mong đợi một chuỗi định dạng, nhưng tôi giả định này, bạn biết. Một /bin/bashphần của lệnh cuối cùng là bash thực thi có thời gian thực hiện được đo, khi chính nó thực thi mkachức năng xuất . Nó thực thi mkachức năng bởi vì nó đọc và thực thi mka -j8 baconlệnh từ đầu vào tiêu chuẩn, đó là lý do tại sao chúng ta sử dụng echovà một đường ống. Xin lỗi vì câu trả lời muộn, chỉ cần đọc này. :)
Malte Skoruppa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.