Embora uma alias
seja uma maneira de fazer isso, isso também pode ser feito eval
- é que você não deseja tanto eval
a execução do comando quanto eval
a declaração do comando .
Eu gosto de alias
es - eu os uso o tempo todo, mas gosto mais de funções - especialmente sua capacidade de lidar com parâmetros e que eles não precisam necessariamente ser expandidos na posição de comando, conforme é necessário para alias
es.
Então eu pensei que talvez você queira tentar isso também:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
A parte $IFS
é principalmente sobre $*
. É importante que isso também( subshell bit )
seja o resultado de uma expansão do shell e, assim, para expandir os argumentos em uma string analisável que eu uso "$*"
(nãoeval
"$@"
use , a propósito, a menos que você tenha certeza de que todos os argumentos podem ser unidos em espaços) . O delimitador de divisão entre args in "$*"
é o primeiro byte in $IFS
e, portanto, pode ser perigoso continuar sem garantir seu valor. Assim, a função salva $IFS
, define-lo para um \n
ewline tempo suficiente para set ... "$*"
nos "$3"
, unset
é ele, em seguida, redefine seu valor se ele já tinha um.
Aqui está uma pequena demonstração:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
Você vê que eu coloquei dois comandos no valor de $TIME
lá - qualquer número é bom - mesmo nenhum -, mas tenha certeza de que foi escapado e citado corretamente - e o mesmo vale para os argumentos _time()
. Todos eles serão concatenados em uma única cadeia de comando quando forem executados - mas cada argumento recebe seu próprio \n
ewline e, portanto, pode ser espalhado com relativa facilidade. Ou então, você pode agrupá-los todos em um, se quiser, e separá-los em \n
linhas de telefone ou ponto-e-vírgula ou o que tiver. Apenas certifique-se de que um único argumento represente um comando que você se sinta confortável em colocar sua própria linha em um script quando o chamar. \(
, por exemplo, é bom, desde que seja seguido por \)
. Basicamente, as coisas normais.
Quando eval
o snippet acima é alimentado, ele se parece com:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
E seus resultados parecem ...
RESULTADO
+++ 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
O hash
erro indica que não tenho um /usr/bin/time
instalado (porque não tenho) e command
vamos saber a que horas está sendo executado. O trailing set +x
é outro comando executado depois time
(o que é possível) - é importante ter cuidado com os comandos de entrada ao executar eval
qualquer coisa.