Si bien una alias
es una forma de hacerlo, esto también se puede hacer eval
: es solo que no desea tanto eval
la ejecución del comando como eval
la declaración del comando .
Me gustan alias
los: 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 alias
es.
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 $IFS
bit 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 \n
ewline el tiempo suficiente para set ... "$*"
dentro "$3"
, unset
es 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 $TIME
allí: 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 \n
argumento 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 \n
lí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 eval
se 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 hash
error indica que no tengo /usr/bin/time
instalado (porque no lo tengo) y command
nos permite saber a qué hora se está ejecutando. El seguimiento set +x
es otro comando ejecutado después time
(lo cual es posible) : es importante tener cuidado con los comandos de entrada al hacer eval
cualquier cosa.