Estoy tratando de cronometrar algo usando:
/usr/bin/time myCommand
Sin embargo, dado que /usr/bin/time
escribe en stderr, si myCommand también escribe en stderr, obtendré más que solo la salida del tiempo en la transmisión. Lo que quiero hacer es redirigir toda la salida de myCommand /dev/null
, pero aún así escribir la salida del tiempo en stderr. Usando un ejemplo de myCommand que escribe en stderr of ls /nofile
, vemos que (obviamente) no hay salida en absoluto con lo siguiente:
$ /usr/bin/time ls /nofile 2> /dev/null
$
Sin ninguna redirección, vemos tanto la salida de ls
(a stderr) como la salida de tiempo (también a 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
Lo que quiero es algo que simplemente produce:
$ /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
¿Algunas ideas?
io-redirection
time-utility
David Doria
fuente
fuente
Respuestas:
En ksh, bash y zsh,
time
es una palabra clave, no una incorporada. Las redirecciones en la misma línea se aplican solo al comando que se está cronometrando, no a la salida detime
sí mismo.Para redirigir la salida de
time
sí mismo en estos shells, debe usar un nivel adicional de agrupación.Si usa la versión GNU de la
time
utilidad independiente , tiene una-o
opción para escribir la salida detime
otro lugar que no sea stderr. Puedes hacertime
escribir en la terminal:Si desea mantener la salida de
time
su error estándar, necesita un nivel adicional de barajado de descriptores de archivo.Con cualquier
time
utilidad, puede invocar un shell intermedio para realizar las redirecciones deseadas. Invocar un shell intermedio para realizar acciones adicionales comocd
redirecciones, etc. es bastante común: es el tipo de pequeñas cosas para las que están diseñados los shells.fuente
exec
reemplaza el shell por el programa especificado en lugar de ejecutar ese programa como un subproceso. Algunos shells realizan esta optimización automáticamente cuando un comando es el último en un script. "Shell intermedio" significa eso: un shell que está entretime
ymycommand
; no está relacionado con las subcapas./dev/tty
es el terminal en el que se ejecuta el comando (no está relacionado con/dev/ttyNUM
cuáles son las consolas físicas; estás confundiendo con los descriptores de archivo: stdin is/dev/fd/0
, etc.).fuente
time
es un alias bash?which time
se muestra/usr/bin/time
en CentOS 5.7.type time
te mostrará:time is a shell keyword