Estoy tratando de cronometrar algo usando:
/usr/bin/time myCommand
Sin embargo, desde /usr/bin/time
escribe en stderr, si myCommand también escribe en stderr, obtendré más que solo la salida de tiempo en la transmisión. Lo que quiero hacer es redirigir toda la salida de myCommand a /dev/null
, pero aún escribe la salida del tiempo en stderr. Usando un ejemplo myCommand que escribe en stderr de ls /nofile
, vemos que (obviamente) no hay ningún resultado con lo siguiente:
$ /usr/bin/time ls /nofile 2> /dev/null
$
Sin ninguna redirección, vemos tanto la salida de ls
(a stderr) y la salida de time (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 produzca:
$ /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
¿Alguna idea?
Respuesta aceptada:
En ksh, bash y zsh, time
es una palabra clave, no una función incorporada. Las redirecciones en la misma línea se aplican solo al comando que se cronometra, no a la salida de time
mismo.
$ time ls -d / /nofile >/dev/null 2>/dev/null
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Para redirigir la salida desde time
en estos caparazones, debe usar un nivel adicional de agrupación.
{ time mycommand 2>&3; } 3>&2 2>mycommand.time
Si usa la versión GNU del time
independiente utilidad, tiene un -o
opción para escribir la salida de time
en otro lugar que no sea stderr. Puedes hacer time
escribe en la terminal:
/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null
Si desea mantener la salida de time
en su error estándar, necesita un nivel adicional de barajado del descriptor de archivo.
/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null
Con cualquier time
utilidad, puede invocar un shell intermedio para realizar las redirecciones deseadas. Invocar un shell intermedio para realizar acciones adicionales como cd
, redirecciones, etc. es bastante común:es el tipo de pequeñas cosas para las que están diseñadas las conchas.
/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'