GNU/Linux >> Tutoriales Linux >  >> Linux

Resultado de la palabra clave Bash Time solo con el segundo comando canalizado, explique por qué.

Tengo un comando de palabra clave bash time que no puedo explicar completamente, pero funciona para mí.

Mi objetivo:

  1. para encontrar el tiempo de ejecución de algún script de python, que toma una variable por cierto, desde dentro de un script de bash, y captura ese valor.

  2. también para capturar la salida del script de python en la misma variable, para análisis de éxito o fracaso.

Después de leer, terminé con este comando, pero no puedo explicarlo completamente.

ttime=$( (TIMEFORMAT="%U^"; time  /../myscript.py ${__myvar} 2>&1 )|& tr -d f)

¿Puede explicar por qué necesito el segundo comando tr -d f en la canalización, para que el valor de tiempo se agregue a la salida del comando,

La elección de 'tr -d f' fue completamente arbitraria y no afectará la salida de mi script, std o err, pero sin él, u otro comando que actúe en la salida de texto de las secuencias de comandos de alguna manera menor, veo el retorno de la python sin la hora adjunta, ¿por qué?

Editar:

La verdadera pregunta debería haber sido por qué |& tr -d f . necesario, y como dice Stephanie, es el |&el que permite que los tiempos encontrados en el sterr de la palabra clave time pasen a la salida de la canalización

La solución ahora se parece a:

ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )

Tutorial de descriptor de campo:

http://wiki.bash-hackers.org/howto/redirection_tutorial

Respuesta aceptada:

En bash , como en ksh , time es una palabra clave (no integrado) que se utiliza para cronometrar una tubería (no solo comando simple, también puede cronometrar comandos compuestos).

En time cmd 2> something , estamos cronometrando cmd 2> something e imprimiendo la salida en stderr, pero en el stderr original.

Necesitas stderr redirigido antes el time se invoca la construcción. Lo que haces con tu |& que redirige el stdout y stderr de la subcapa time se ejecuta, pero una forma mucho más sencilla de hacerlo sería:

time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)

Eso no implica una subcapa (aquí usamos un grupo de comandos en su lugar) ni un comando extra.

Tenga en cuenta que con bash :

time=$(time (cmd) 2>&1)

pasa a trabajar por accidente. No confiaría en eso, ya que podría cambiar en futuras versiones y no funciona en otros shells que tienen un time palabra clave.

Si solo desea la salida de tiempo en $time (y no el stdout o stderr del comando), haría:

{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1

Linux
  1. Programar una tarea con Linux al mando

  2. Comandos acoplados con operadores de control en Bash

  3. ¿Por qué es legal establecer una variable antes de un comando en Bash?

  4. ¿El comando Rm en Bash Script no funciona con variables?

  5. '&&' vs. '&' con el comando 'test' en Bash

Tutorial de Bash HereDoc con ejemplos

Cómo ejecutar un comando con límite de tiempo (tiempo de espera) en Linux

Comando Bash Echo explicado con ejemplos en Linux

Bash Scripting - Comando Printf explicado con ejemplos

Seguimiento del tiempo con Timewarrior en la línea de comandos

Ejecutar comandos con límite de tiempo en Ubuntu 20.04