ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวเมื่อเรียกใช้งาน / usr / bin / time


11

ฉันกำลังสร้างรอม Android ของฉันเอง เพื่อที่จะสร้างมันฉันต้องวิ่ง

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 ในไดเร็กทอรี build 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

ปัญหาคือว่า evnsetup.sh เริ่มต้นบางสิ่ง ในเทอร์มินัลฉันต้องเรียกใช้ไฟล์นั้นก่อนที่ฉันจะสามารถเรียก mka ได้ เห็นได้ชัดว่ามันไม่ได้รับการยอมรับเมื่อเรียกมันเป็นพารามิเตอร์จากคำสั่งเวลา
P1nGu1n

ฉันจะทำสิ่งนี้ซ้ำได้อย่างไร
Braiam

หลังจากที่คุณดำเนินการsource build/evnsetup.shณ จุดที่คุณต้องการโทรtime mka -j8 baconคุณสามารถโพสต์เอาท์พุทของคำสั่งได้type mkaหรือไม่?
Malte Skoruppa

@ เอาท์พุท MalteSkoruppa เพิ่ม mka ดูเหมือนจะเป็นฟังก์ชั่นทุบตี?
P1nGu1n

คำตอบ:


11

ปัญหาคือว่าmkaเป็นฟังก์ชั่นทุบตีส่งออกโดยสคริปต์ของคุณและไม่ปฏิบัติการ (ตรงข้ามกับ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

ฟังก์ชันในตัวtimeของ bash นั้นทราบถึงฟังก์ชัน 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

คุณไม่สามารถวัดเวลาของฟังก์ชั่น bash ในตัวได้โดยตรง/usr/bin/time(เท่าที่ฉันรู้) แต่สิ่งที่คุณทำได้คือวัดเวลาของการ/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

ดังนั้นในกรณีของคุณเพื่อให้สามารถใช้/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

1
-fพารามิเตอร์เพื่อexportบอกexportการส่งออกฟังก์ชั่นเชลล์ help exportดู -fพารามิเตอร์/usr/bin/timeบอก/usr/bin/timeที่คาดหวังสตริงรูปแบบ แต่ผมถือว่านี้คุณรู้ว่า /bin/bashส่วนหนึ่งของคำสั่งสุดท้ายคือปฏิบัติการทุบตีที่มีเวลาการดำเนินการเป็นวัดจริงเมื่อมันเองดำเนินการส่งออกmkaฟังก์ชั่น มันรันmkaฟังก์ชั่นเพราะมันอ่านและดำเนินการmka -j8 baconคำสั่งจากอินพุตมาตรฐานซึ่งเป็นเหตุผลที่เราใช้echoและไปป์ ขออภัยสำหรับคำตอบที่ล่าช้าเพียงแค่อ่านนี้ :)
Malte Skoruppa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.