time
escribe en stderr
, por lo que uno supondría que agregar 2>&1
a 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 wc
interpreta como un solo comando?
io-redirection
shell-builtin
gatos lobo-revo
fuente
fuente
time
es la palabra clave de shell o/usr/bin/time
. Puede haber varios conjuntos de descriptores involucrados aquí (el shell y los adjuntos a untime
proceso). Y no nos olvidemos de los implicados por la()
subshell. ( esperando un especialista en bash : p)Respuestas:
En
ksh
,bash
yzsh
,time
no es un comando (incorporado o no), es una palabra reservada en el idioma comofor
owhile
.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> error
comando y las estadísticas de cronometraje siguen en el stderr del shell.Necesitas:
O:
Para que se redireccione stderr del shell
timing-output
antes 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
time
construcció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
time
se invoca la construcción.La mayoría de los sistemas también tienen un
time
comando. Puede invocarlo deshabilitando latime
palabra 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
time
ycmd
se fusionaráerror-and-timing-output
.Además, el
time
comando, a diferencia deltime
construcció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
bash
tiene (lo que se puede considerar como) un error por el cualtime (cmd) 2> file
(pero notime cmd | (cmd2) 2> file
por ejemplo) redirige la salida de temporización afile
fuente
time
es 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
,time
ywc
se 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, quetime
es una palabra clave de shell, cuando escribetime wc ...
, el shell utiliza su palabra clave entime
lugar de la utilidad de tiempo externo .Cuando el shell utiliza la
time
palabra clave, no necesita bifurcar () el nuevo proceso, eltime
estándar actual y el error estándar no se modifican. La parte de redireccionamiento en:afecta
wc
solo .Cuando usa un comando compuesto
(list)
:el shell se ejecutó
time wc file
dentro 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 ambostime
ywc
.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
time
y/usr/bin/time
? ¿Los ejecutables se llaman funcionalmente iguales?Porque
time
estás ejecutando es bash incorporado. Bash lo procesa de manera tan especial.Si usará
time
binario real , actuará exactamente de la manera que lo espera:Aunque el resultado de este tiempo es un poco diferente:
fuente
time cmd > output
veces elcmd > output
comando ytime foo | bar
vecesfoo | bar
.No lo es
time
que escribe la información del tiempo. El builtintime
hace 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