digamos que tenemos un script bash que contiene comandos, algunos de los cuales pueden tener símbolos de y comercial ( & ). Me gustaría medir el tiempo de ejecución de una secuencia de comandos de este tipo utilizando /usr/bin/time, pero debido a los símbolos de unión, el trabajo real se realiza en segundo plano, mientras que la secuencia de comandos devuelve el comando al shell, lo que da como resultado mediciones iguales a cero. .
¿Hay alguna manera de suprimir el comportamiento de ampersand (es decir, no permitir que los comandos se ejecuten en segundo plano)?
La razón por la que estoy tratando de hacer esto es porque quiero hacer un punto de referencia a gran escala (gran cantidad de conjuntos de datos y más de varias herramientas (algunas de las cuales muestran tal comportamiento)).
Un ejemplo concreto, muy sencillo, sería el siguiente.
Cree un script test.sh que contenga:
#! /bin/sh sleep 2 &E intenta ejecutarlo con:
/usr/bin/time ./test.shEl resultado es:
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 668maxresident)k 0inputs+0outputs (0major+219minor)pagefaults 0swapsEl resultado esperado sería alrededor de 2 segundos (ya sea CPU o tiempo transcurrido).
Tenga en cuenta que el guión anterior es solo un ejemplo de juguete. Además, supongamos que no se puede modificar (míralo como un cuadro negro).
Esta es una combinación de respuestas de Elliott Frisch y Gilles (en los comentarios), y pretende resumir las cosas.
La respuesta es crear un script contenedor wrapper.sh que se vea así:
#! /bin/sh . $*; wait el . (comando fuente) obligará a que el trabajo se ejecute en el mismo shell y no en segundo plano, y wait esperará a que finalicen todos los subprocesos.
Esto ahora se puede ejecutar como:
/usr/bin/time ./wrapper.sh ./test.sh Tenga en cuenta que el uso del comando fuente le impide cambiar el intérprete en la línea shebang de test.sh