เปลี่ยนทิศทางเอาต์พุตของคำสั่งใน 'time command'


11

ฉันกำลังพยายามกำหนดเวลาบางสิ่งที่ใช้:

/usr/bin/time myCommand

อย่างไรก็ตามเนื่องจาก/usr/bin/timeเขียนไปยัง stderr ถ้าmyCommandเขียนไปยัง stderr ด้วยฉันจะได้รับมากกว่าเวลาของสตรีม สิ่งที่ฉันต้องการจะทำคือเปลี่ยนเส้นทางเอาต์พุตทั้งหมดของ myCommand ไป/dev/nullแต่ยังคงเขียนเอาต์พุตของเวลาไปยัง stderr เมื่อใช้ตัวอย่างmyCommandที่เขียนไปยัง stderr ของls /nofileเราจะเห็นว่า (เห็นได้ชัด) ว่าไม่มีเอาต์พุตเลยด้วยต่อไปนี้:

$ /usr/bin/time ls /nofile 2> /dev/null
$

โดยไม่มีการเปลี่ยนเส้นทางใด ๆ เราจะเห็นทั้งเอาต์พุตจากls(ไปยัง stderr) และเอาต์พุตจากเวลา (เช่นไปยัง stderr):

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

สิ่งที่ฉันต้องการคือสิ่งที่ผลิตง่ายๆ:

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

ความคิดใด ๆ


ฉันใช้คำสั่ง time ในไฟล์สคริปต์ ฉันต้องการเอาต์พุตเวลาใน stdout แทน stderr ฉันจะได้รับสิ่งนี้ได้อย่างไร

คำตอบ:


20

ใน ksh, bash และ zsh, timeเป็นคีย์เวิร์ดไม่ใช่บิวอิน การเปลี่ยนเส้นทางในบรรทัดเดียวกันจะใช้กับคำสั่งที่กำหนดเวลาเท่านั้นไม่ใช่กับเอาต์พุตของtimeตัวเอง

$ time ls -d / /nofile >/dev/null 2>/dev/null

real    0m0.003s
user    0m0.000s
sys     0m0.000s

ในการเปลี่ยนเส้นทางเอาต์พุตจากtimeตัวเองในเชลล์เหล่านี้คุณต้องใช้ระดับการจัดกลุ่มเพิ่มเติม

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

หากคุณใช้เวอร์ชัน GNU ของtimeยูทิลิตี้แบบสแตนด์อโลนมี-oตัวเลือกในการเขียนเอาต์พุตของtimeที่อื่นนอกเหนือจาก stderr คุณสามารถtimeเขียนถึงเทอร์มินัล:

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

หากคุณต้องการเก็บเอาท์พุทจากtimeข้อผิดพลาดมาตรฐานคุณต้องมีการสับไฟล์อธิบายเพิ่มเติม

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

ด้วยtimeยูทิลิตี้ใด ๆคุณสามารถเรียกใช้เชลล์ระดับกลางเพื่อดำเนินการเปลี่ยนเส้นทางที่ต้องการ เรียกใช้เชลล์ระดับกลางเพื่อดำเนินการพิเศษเช่นการcdเปลี่ยนเส้นทาง ฯลฯ เป็นเรื่องปกติ - เป็นประเภทเล็ก ๆ น้อย ๆ ที่เชลล์ได้รับการออกแบบมาให้ทำ

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'

สองสามรายการติดตาม: 1) 'exec' ในคำแนะนำสุดท้ายของคุณทำอะไร? ดูเหมือนว่าจะทำงานโดยไม่ได้: / usr / bin / time sh -c 'exec ls / nofile &> ./ output.dat' 2) เป็น "เชลล์ระดับกลาง" เหมือนกับ "subshell" (ซึ่งคุณจะได้รับฉัน คิดว่าใช้วงเล็บใช่ไหม) ฉันลองใช้สิ่งต่าง ๆ เช่น / usr / bin / time (ls / nofile &> ./ output.dat) โดยไม่มีประโยชน์ 3) / dev / tty คืออะไร ฉันรู้ว่า tty0 คือ stdin, tty1 = stdout, tty2 = stderr แต่จะเป็น 'tty' แค่ไหน?
David Doria

4) ด้วยตัวเลือก / dev / fd3 ดูเหมือนว่าคุณกำลังพูดว่าจะเขียนเอาต์พุต -o เป็น 3 จากนั้นเปลี่ยนเส้นทาง 3 ถึง 2, 1 เป็น null และ 2 เป็น null ไม่ควรส่ง 3 เป็นโมฆะเนื่องจากการเปลี่ยนเส้นทางเกิดจากซ้ายไปขวา
David Doria

1
@DavidDoria execแทนที่เชลล์ด้วยโปรแกรมที่ระบุแทนการรันโปรแกรมนั้นเป็น subprocess เชลล์บางตัวดำเนินการออปติไมซ์นี้โดยอัตโนมัติเมื่อคำสั่งเป็นอันสุดท้ายในสคริปต์ “ Intermediate shell” หมายถึงแค่นั้น: เชลล์ที่อยู่ระหว่างtimeและmycommand; มันไม่เกี่ยวข้องกับ subshells /dev/ttyเป็นเทอร์มินัลที่คำสั่งกำลังทำงานอยู่ (ซึ่งไม่เกี่ยวข้องกับ/dev/ttyNUMคอนโซลแบบฟิสิคัลคุณสับสนกับตัวอธิบายไฟล์: stdin is /dev/fd/0และอื่น ๆ )
Gilles 'หยุดความชั่วร้าย'

@DavidDoria การเปลี่ยนไฟล์ descriptor เชื่อมต่อกับสิ่งที่เกิดขึ้นจากซ้ายไปขวาซึ่งมีผลตรงกันข้าม ดูunix.stackexchange.com/questions/23964/...หรือunix.stackexchange.com/questions/37660/order-of-redirections
กิลส์ 'ทีเราหยุดการชั่วร้าย'

0
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

real    0m0.006s
user    0m0.001s
sys 0m0.004s

นั่นไม่ใช่ 'เวลา' เดียวกัน (มันเป็นนามแฝงทุบตีที่ฉันเชื่อ) โปรดทราบว่าไม่ปฏิบัติตามกฎการเปลี่ยนเส้นทางที่สมเหตุสมผลหรือไม่ $ time &> / dev / null ผู้ใช้จริง 0m0.000s 0m0.000s sys 0m0.000s
David Doria

1
วิธีการเกี่ยวกับเรื่องนี้: / usr / bin / time -o time / usr / bin / find / etc / pki / CA / private / &> / dev / null; เวลาแมว
Artur Szymczak

ใช่ฉันเคยเห็นมาแล้ว แต่ฉันอยากรู้มากขึ้นเกี่ยวกับวิธีการทำโดยไม่ต้องใช้กลไกภายในเช่น -o
David Doria

@DavidDoria อะไรที่ทำให้คุณประทับใจว่าtimeเป็นทุบตีนามแฝง? which timeแสดง/usr/bin/timeใน CentOS 5.7
Timothy Martin

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