Embora uma aliasseja uma maneira de fazer isso, isso também pode ser feito eval- é que você não deseja tanto evala execução do comando quanto evala declaração do comando .
Eu gosto de aliases - 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 aliases.
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 $IFSe, portanto, pode ser perigoso continuar sem garantir seu valor. Assim, a função salva $IFS, define-lo para um \newline 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 $TIMElá - 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 \newline e, portanto, pode ser espalhado com relativa facilidade. Ou então, você pode agrupá-los todos em um, se quiser, e separá-los em \nlinhas 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 evalo 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 hasherro indica que não tenho um /usr/bin/timeinstalado (porque não tenho) e commandvamos 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 evalqualquer coisa.