Si bien una aliases una forma de hacerlo, esto también se puede hacer eval: es solo que no desea tanto evalla ejecución del comando como evalla declaración del comando .
Me gustan aliaslos: los uso todo el tiempo, pero me gustan más las funciones, especialmente su capacidad para manejar parámetros y que no necesariamente se deben expandir en la posición de comando como se requiere para los aliases.
Así que pensé que quizás también quieras probar esto:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
El $IFSbit es principalmente sobre $*. Es importante que el ( subshell bit )es también el resultado de un desarrollo del forro y así con el fin de ampliar los argumentos en una cadena de uso parsable I "$*" (no hacerlo eval "$@", por cierto, a menos que esté seguro de todos los argumentos se pueden unir bajo espacios) . El delimitador dividido entre args in "$*"es el primer byte in $IFS, por lo que podría ser peligroso proceder sin asegurarse de su valor. Por lo que la función guarda $IFS, lo configura a un \newline el tiempo suficiente para set ... "$*"dentro "$3", unsetes que, a continuación, restablece su valor si antes tenía uno.
Aquí hay una pequeña demostración:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
Verá, pongo dos comandos en el valor de $TIMEallí: cualquier número está bien, incluso ninguno, pero asegúrese de que se escape y se cite correctamente, y lo mismo ocurre con los argumentos _time(). Todos se concatenarán en una sola cadena de comando cuando se ejecuten, pero cada \nargumento tiene su propia línea de conexión y, por lo tanto, se pueden distribuir con relativa facilidad. O bien, puede agruparlos todos en uno, si lo desea, y separarlos en \nlíneas electrónicas o punto y coma o lo que sea que tenga. Solo asegúrese de que un solo argumento represente un comando con el que se sienta cómodo al poner su propia línea en un script cuando lo llame. \(, por ejemplo, está bien, siempre que finalmente se siga con \). Básicamente las cosas normales.
Cuando evalse alimenta el fragmento anterior, se ve así:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
Y, sus resultados parecen ...
SALIDA
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real 0m0.003s
user 0m0.000s
sys 0m0.000s
++ set +x
El hasherror indica que no tengo /usr/bin/timeinstalado (porque no lo tengo) y commandnos permite saber a qué hora se está ejecutando. El seguimiento set +xes otro comando ejecutado después time (lo cual es posible) : es importante tener cuidado con los comandos de entrada al hacer evalcualquier cosa.