Estoy tratando de cronometrar algo usando:
/usr/bin/time myCommand
Sin embargo, dado que /usr/bin/timeescribe 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,
timees 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 detimesí mismo.Para redirigir la salida de
timesí mismo en estos shells, debe usar un nivel adicional de agrupación.Si usa la versión GNU de la
timeutilidad independiente , tiene una-oopción para escribir la salida detimeotro lugar que no sea stderr. Puedes hacertimeescribir en la terminal:Si desea mantener la salida de
timesu error estándar, necesita un nivel adicional de barajado de descriptores de archivo.Con cualquier
timeutilidad, puede invocar un shell intermedio para realizar las redirecciones deseadas. Invocar un shell intermedio para realizar acciones adicionales comocdredirecciones, etc. es bastante común: es el tipo de pequeñas cosas para las que están diseñados los shells.fuente
execreemplaza 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á entretimeymycommand; no está relacionado con las subcapas./dev/ttyes el terminal en el que se ejecuta el comando (no está relacionado con/dev/ttyNUMcuáles son las consolas físicas; estás confundiendo con los descriptores de archivo: stdin is/dev/fd/0, etc.).fuente
timees un alias bash?which timese muestra/usr/bin/timeen CentOS 5.7.type timete mostrará:time is a shell keyword