Bien que an alias
soit une façon de le faire, cela peut être fait eval
aussi - c'est juste que vous ne voulez pas tant eval
l'exécution de eval
la commande que la déclaration de commande .
J'aime alias
es - je les utilise tout le temps, mais j'aime mieux les fonctions - en particulier leur capacité à gérer les paramètres et qu'elles ne doivent pas nécessairement être étendues en position de commande comme cela est requis pour alias
es.
J'ai donc pensé que vous voudriez peut-être essayer aussi:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
Le $IFS
bit concerne principalement $*
. Il est important que le ( subshell bit )
soit également le résultat d'une expansion du shell et donc afin d'étendre les arguments dans une chaîne analysable que j'utilise "$*"
(ne le faites pas eval
"$@"
, d'ailleurs, sauf si vous êtes certain que tous les arguments peuvent être joints sur des espaces) . Le délimiteur divisé entre les arguments dans "$*"
est le premier octet $IFS
, et il peut donc être dangereux de continuer sans s'assurer de sa valeur. Ainsi , la fonction permet d' enregistrer $IFS
, il met un \n
ewline assez longtemps pour set ... "$*"
en "$3"
, unset
s, puis remet à zéro sa valeur si elle avait déjà un.
Voici une petite démo:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
Vous voyez, j'ai mis deux commandes dans la valeur de $TIME
there - n'importe quel nombre est correct - même aucun - mais assurez-vous qu'il est échappé et cité correctement - et il en va de même pour les arguments _time()
. Ils seront tous concaténés en une seule chaîne de commande lors de leur exécution - mais chaque argument obtient sa propre ligne \n
électronique et peut donc être étalé relativement facilement. Ou bien, vous pouvez les \n
regrouper en un seul, si vous le souhaitez, et les séparer sur des lignes électroniques ou des points-virgules ou ce que vous avez. Assurez-vous simplement qu'un seul argument représente une commande que vous seriez à l'aise de mettre sur sa propre ligne dans un script lorsque vous l'appelez. \(
, par exemple est très bien, tant qu'il est finalement suivi de \)
. Fondamentalement, le truc normal.
Lorsque eval
l'extrait ci-dessus est alimenté, il ressemble à ceci:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
Et ses résultats ressemblent à ...
PRODUCTION
+++ 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
L' hash
erreur indique que je n'ai pas /usr/bin/time
installé (parce que je n'ai pas) et command
laissez-nous savoir quelle heure est en cours d'exécution. Le suivi set +x
est une autre commande exécutée après time
(ce qui est possible) - il est important d'être prudent avec les commandes d'entrée lors de eval
n'importe quoi.