El "tiempo" incorporado de Bash en la cadena no se ejecuta

El "tiempo" incorporado de Bash en la cadena no se ejecuta
$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

¿Que está pasando aqui? No se trata de que las funciones integradas del shell no funcionen, porque esto funciona:

$ cmd2='echo wef'
$ $cmd2
wef

¿Algunas ideas?

Editar: encontré una diferencia:

$ type time
time is a shell keyword

Contra:

$ type echo
echo is a shell builtin

Entonces la pregunta ahora es: ¿por qué una función incorporada funciona en una cadena y una palabra clave no?

Respuesta1

timecomo unGolpe GNULa palabra clave tiene una ubicación muy específica donde se acepta; consulte, por ejemplo, la sintaxis de una construcción de canalización de comandos:

El formato de una canalización es [time [-p]] [!] command1 [| command2 ...]

Esto codifica la posición de la palabra clave fuera de las expansiones (comocomandoNserá donde se amplían los parámetros y variables). De hecho, también la semántica se aplica a toda la canalización, no al comando, por lo que probablemente sea esta la razón por la que tiene que ser una palabra clave.

Hay un shell incorporado times(en POSIX aespecial incorporado), para esto la expansión funciona ya que la primera palabra puede ser un ejecutable o un shell incorporado.

AlternativamentePrincipales utilidades de GNU contiene un /bin/timeejecutable.

De hecho timeno es asípalabra reservadaenCarcasa POSIX(aunque bash lo reconoce enmodo posixde todos modos (a menos que -siga por razones no obvias)).

Dentro de una evalexpresión, las palabras clave son reconocidas porintento, por lo que esto se puede utilizar para mejorar dinámicamente los comandos con perfiles de tiempo. (Sin embargo, requiere una ronda adicional de cotización)

Respuesta2

En lugar de usar cmd='time sleep 2', intente usarlo como cmd='/usr/bin/time sleep 2' para obtener el comando en tiempo real.

Puedes leer lo siguiente en el tiempo de hombre:

Los usuarios del shell bash deben usar una ruta explícita para ejecutar el comando de tiempo externo y no la variante incorporada del shell. En el sistema donde la hora está instalada en /usr/bin, el primer ejemplo sería /usr/bin/time wc /etc/hosts

información relacionada