Enquanto um alias é uma maneira de fazer isso, isso pode ser feito com eval também - é só que você não quer muito eval a execução do comando como você deseja eval o comando declaração .
Eu gosto de alias es - eu os uso o tempo todo, mas gosto mais de funções - especialmente de sua capacidade de manipular parâmetros e de que eles não precisam necessariamente ser expandidos na posição de comando, como é necessário para alias es .
Então, achei que você gostaria de tentar também:
_time() if set -- "${IFS+IFS=\;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
O $IFS bit é principalmente sobre $* . É importante que o ( subshell bit ) seja também o resultado de uma expansão do shell e, assim, para expandir os argumentos em uma string analisável eu uso "$*" (não eval "$@" , a propósito, a menos que você esteja certo de que todos os args podem ser unidos em espaços) . O delimitador de divisão entre args em "$*" é o primeiro byte em $IFS e, portanto, pode ser perigoso continuar sem garantir seu valor. Assim, a função salva $IFS , configura para \n ewline tempo suficiente para set ... "$*" em "$3" , unset s e redefine seu valor se tiver um anteriormente.
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 there - qualquer número é bom - mesmo nenhum - mas tenha certeza de que é escapado e citado corretamente - e o mesmo vale para os argumentos para _time() . Eles serão todos concatenados em uma única cadeia de comandos quando forem executados - mas cada argumento obtém seu próprio \n ewline e, portanto, eles podem ser distribuídos com relativa facilidade. Ou então você pode juntá-los todos em um, se quiser, e separá-los em \n ewlines ou ponto e vírgula ou what-have-you. Apenas certifique-se de que um único argumento represente um comando que você se sinta confortável colocando em sua própria linha em um script quando o chamar. \( , por exemplo, é bom, desde que seja seguido por \) . Basicamente o material normal.
Quando eval recebe o snippet acima, parece que:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
E seus resultados parecem ...
OUTPUT
+++ 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 erro hash indica que não tenho um /usr/bin/time instalado (porque não o tenho) e command nos informa qual tempo está sendo executado. O trailing set +x é outro comando executado após time (o que é possível) - é importante ter cuidado com comandos de entrada quando eval ing qualquer coisa. / p>