ทำไมคำสั่ง `time 'ไม่ทำงานกับตัวเลือกใด ๆ


61

ฉันพยายามใช้timeคำสั่งด้วย-fตัวเลือกเพื่อจัดรูปแบบผลลัพธ์ของเวลา แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

-f: command not found

แล้วฉันพยายามที่จะใช้ตัวเลือกอื่น ๆ-a, -oฯลฯ และฉันได้รับข้อผิดพลาดเดียวกัน ไม่แม้แต่time --versionจะไม่ทำงาน ( --version: command not found)

อย่าบอกให้ฉันอ่านผู้ชายเพราะฉันทำไปแล้วหลายต่อหลายครั้ง ... ตัวเลือกทั้งหมดนี้ระบุไว้ที่นั่น ดังนั้นปัญหาอาจจะอยู่ที่ไหน


ไม่sudo apt-get install --reinstall timeช่วย?
jobin

9
หรืออาจจะเป็นเปลือกภายในtimeด้วย/usr/bin/time
Rmano

คำตอบ:


91

man timeดีแม้ว่าคุณจะไม่ชอบมันผมจะทำให้คุณอ่านอีกครั้งกับความสนใจมากขึ้น ในตอนท้ายของEXAMPLESส่วนคุณจะพบ:

  Users of the bash shell need to use an explicit path in order to run
  the external time command and not the shell builtin variant.  On system
  where time is installed in /usr/bin, the first example would become
       /usr/bin/time wc /etc/hosts

ดังนั้นฉันสมมติว่าคุณใช้ bash shell ซึ่งใช้เวอร์ชันภายในของtimeซึ่งเป็นคำหลักของเชลล์ คุณสามารถตรวจสอบสิ่งนี้ได้โดยใช้คำสั่งต่อไปนี้:

type time

และผลลัพธ์อาจจะเป็น:

time is a shell keyword

หากเป็นกรณีนี้แล้วมีความชัดเจนที่จะใช้จริง คำสั่งคุณต้องใช้เส้นทางที่ชัดเจนของมันtime/usr/bin/time

นอกจากนี้หากคุณไม่ต้องการใช้คำหลักของเชลล์อีกต่อไปtimeคุณสามารถสร้างชื่อแทนถาวรได้ดังนี้:

alias time='/usr/bin/time'

สิ่งนี้จะเขียนทับคีย์เวิร์ดเชลล์timeเนื่องจากคำสั่ง:

type time

จะให้ผลลัพธ์ต่อไปนี้ตอนนี้:

time is aliased to `/usr/bin/time'

5
สำหรับคำสั่งเชลล์บิวด์: {info time} และ {type time} สำหรับคำสั่งไบนารี: {เวลาไหนและ {เวลามนุษย์}
Michael Martinez

@Michael info timeเกี่ยวกับไบนารี help timeเป็นเรื่องเกี่ยวกับ builtin
wjandrea

ใช่ขอโทษฉันคิดว่า "ช่วย" แต่ออกมา "ข้อมูล"
Michael Martinez

21

เนื่องจากคำตอบอื่น ๆ อธิบายtimeเป็นคำหลักของเชลล์ตัวเลือกเดียวที่คุณมีคือ-p:

terdon@oregano ~ $ help time
time: time [-p] pipeline
    Report time consumed by pipeline's execution.

Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.

Options:
  -p    print the timing summary in the portable Posix format

ดังนั้นคุณต้องเรียกใช้สิ่งtimeต่อ/usr/binไปนี้ นี่เป็นวิธีที่ทำได้สองวิธี:

  • ใช้timeปฏิบัติการแทน:

    /usr/bin/time -f %Uuser ls >/dev/null
  • ใช้\สิ่งที่ทำให้เปลือกของคุณละเว้นชื่อแทนและคำหลักและค้นหา$PATHการปฏิบัติการที่ตรงกัน:

    \time -f %Uuser ls >/dev/null 
  • ใช้commandbuiltin ซึ่งมีผลคล้ายกัน:

    command time -f %Uuser ls >/dev/null
  • ใช้เปลือกที่แตกต่างกันหนึ่งที่ไม่มีคำหลักดังกล่าว ตัวอย่างsh(ซึ่งจริง ๆ แล้วdashบน Ubuntu):

    sh -c "time -f %Uuser ls >/dev/null"
  • ใช้whichซึ่งจะค้นหาผ่านของคุณ$PATH(ตกลงอันนี้มันโง่):

    $(which time) -f %Uuser ls >/dev/null

มีวิธีที่จะทำในสิ่งที่ตรงกันข้าม - ทำซ้ำในตัวtimeด้วยปกติ/usr/bin/timeหรือไม่ คือการแปลสคริปต์ทุบตีเป็นเส้นประ
Dan M.

@DanM ฉันไม่เข้าใจ หากคุณต้องการ builtin เรียกใช้time หากคุณต้องการที่ปฏิบัติการแบบสแตนด์อโลนทำงานtime /usr/bin/time
terdon

ไม่มี built-in timeบนเชลล์เริ่มต้นของ Ubuntu เท่าที่ฉันทราบ ฉันต้องการแปลสคริปต์โดยใช้บิวด์อินเป็นสแตนด์อโลนที่มีลักษณะการทำงานเดียวกัน
Dan M.

@DanM timeจากนั้นเพียงแค่ใช้ มันจะเรียกว่าอันไหนใช้ได้ นั่นจะเป็น builtin สำหรับ bash และ standalone สำหรับ dash หากคุณใช้/usr/bin/timeมันจะเรียกว่าเป็นแบบสแตนด์อโลนเสมอทั้งแบบทุบตีและเส้นประ แต่ดูเหมือนคุณควรถามคำถามใหม่อธิบายพฤติกรรมที่คุณต้องการ แจ้งให้เราทราบหากคุณทำและฉันจะลองและช่วย
terdon

ใช่ แต่ในตัวและแบบสแตนด์อโลนมีไวยากรณ์ / อรรถศาสตร์ที่แตกต่างกันอย่างมาก อย่างไรก็ตามขอบคุณ ฉันจะถามคำถามใหม่ว่าฉันจะไม่เข้าใจวิธีจัดการกับตัวเอง
Dan M.

17

bashและzshเปลือกหอยมีภายในของพวกเขาtimeคำสั่ง คุณต้องใช้

/usr/bin/time -f ...

BTW ฉันค้นพบว่าการใช้ (จากzsh):

~% which  time
time: shell reserved word
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.