timeescribe en stderr, por lo que uno supondría que agregar 2>&1a la línea de comando debería enrutar su salida a stdout. Pero esto no funciona:
test@debian:~$ cat file
one two three four
test@debian:~$ time wc file > wc.out 2>&1
real 0m0.022s
user 0m0.000s
sys 0m0.000s
test@debian:~$ cat wc.out
1 4 19 file
Solo con paréntesis funciona:
test@debian:~$ (time wc file) > wc.out 2>&1
test@debian:~$ cat wc.out
1 4 19 file
real 0m0.005s
user 0m0.000s
sys 0m0.000s
¿Por qué se necesitan paréntesis en este caso? ¿Por qué no se time wcinterpreta como un solo comando?
io-redirection
shell-builtin
gatos lobo-revo
fuente
fuente

timees la palabra clave de shell o/usr/bin/time. Puede haber varios conjuntos de descriptores involucrados aquí (el shell y los adjuntos a untimeproceso). Y no nos olvidemos de los implicados por la()subshell. ( esperando un especialista en bash : p)Respuestas:
En
ksh,bashyzsh,timeno es un comando (incorporado o no), es una palabra reservada en el idioma comoforowhile.Se usa para cronometrar una tubería 1 .
En:
Tiene una sintaxis especial que le dice al shell que ejecute esa tubería:
E informe estadísticas de tiempo para ello.
En:
Es lo mismo, estás temporización de la
cmd > output 2> errorcomando y las estadísticas de cronometraje siguen en el stderr del shell.Necesitas:
O:
Para que se redireccione stderr del shell
timing-outputantes de que se use la construcción de tiempo (nuevamente, no comando ) (aquí de vez en cuandocmd > output 2> error 3>&-).También puede ejecutar esa
timeconstrucción en una subshell que tiene su stderr redirigido:Pero esa subshell no es necesaria aquí, solo necesita que se redireccione stderr en el momento en que
timese invoca la construcción.La mayoría de los sistemas también tienen un
timecomando. Puede invocarlo deshabilitando latimepalabra clave. Todo lo que necesita hacer es citar esa palabra clave de alguna manera, ya que las palabras clave solo se reconocen como tales cuando son literales.Pero cuidado, el formato puede ser diferente y el más antiguo de ambos
timeycmdse fusionaráerror-and-timing-output.Además, el
timecomando, a diferencia deltimeconstrucción, no puede cronometrar tuberías o comandos compuestos o funciones o funciones integradas de shell ...Si se tratara de un comando incorporado, podría ser capaz de cronometrar invocaciones de funciones o incorporados, pero no podría cronometrar redireccionamientos o canalizaciones o comandos compuestos.
1 Tenga en cuenta que
bashtiene (lo que se puede considerar como) un error por el cualtime (cmd) 2> file(pero notime cmd | (cmd2) 2> filepor ejemplo) redirige la salida de temporización afilefuente
timees una palabra clave, no un shell incorporado.'time'para obtener el ejecutable, más útil que escribir/usr/bin/time(o inclusocommand time:-)).\time.No hay ningún comando con nombre
time wc,timeywcse separan las palabras en shell.Ahora, a menudo hay dos programas separados nombrados
time, uno es una palabra clave de shell, otro es un comando externo . En shells, quetimees una palabra clave de shell, cuando escribetime wc ..., el shell utiliza su palabra clave entimelugar de la utilidad de tiempo externo .Cuando el shell utiliza la
timepalabra clave, no necesita bifurcar () el nuevo proceso, eltimeestándar actual y el error estándar no se modifican. La parte de redireccionamiento en:afecta
wcsolo .Cuando usa un comando compuesto
(list):el shell se ejecutó
time wc filedentro de un subshell,(time wc file)se consideró un comando único y la parte de redirección afecta su salida estándar y error estándar, que ahora incluye ambostimeywc.Puede hacer el mismo efecto, sin el costo de bifurcar un nuevo proceso utilizando otra forma de comando de agrupación
{list;}:Si usa externo
time, entonces no enfrenta este problema, porque se ejecutó en un nuevo proceso:fuente
timey/usr/bin/time? ¿Los ejecutables se llaman funcionalmente iguales?Porque
timeestás ejecutando es bash incorporado. Bash lo procesa de manera tan especial.Si usará
timebinario real , actuará exactamente de la manera que lo espera:Aunque el resultado de este tiempo es un poco diferente:
fuente
time cmd > outputveces elcmd > outputcomando ytime foo | barvecesfoo | bar.No lo es
timeque escribe la información del tiempo. El builtintimehace que el shell escriba esto después de que se haya completado el comando. Pero la redirección afecta solo al comando.En el
(time ...)caso, la redirección se aplica a toda la subshell.fuente
Debido a que el tiempo es una cáscara incorporada, escribe en el stderr shell , en lugar del stderr del comando.
El uso de paréntesis fuerza el comando completo en un shell hijo cuyo stderr se puede redirigir.
El uso de corchetes produce un resultado similar sin realmente iniciar una subshell
(sí, necesitas el punto y coma)
fuente