Com zsh
para comandos simples:
my-batch() {print -r -- ${(qq)@} | batch}
my-batch python some_longrunning_computational_script.sh
faria isso.
Se precisar de coisas mais complexas, como loops ou redirecionamentos, você pode fazer:
my-batch eval 'for i in ...; done'
my-batch eval 'echo test > /some/file'
Mas lembre-se de usar sh
, não zsh
sintaxe.
Se você quiser evitar o eval
, use este truque:
alias my-batch=':||'
preexec()
if [[ $1 = my-batch\ * ]]; then
print -r -- "${1#my-batch }" | batch
fi
Novamente, certifique-se de usar a sintaxe sh
.
Tenha em atenção que pode ser apenas um um comando (na verdade, um pipeline). Se você precisar de mais de um, use chaves:
my-batch { ls > /tmp/a; date > /tmp/b; }
A ideia acima é que o comando my-batch
não faz nada, nem sequer avalia os argumentos do comando porque, por exemplo, my-batch echo $(date)
expande para :|| echo $(date)
e é preexec
que é executado cada vez que uma linha de comando é aceito que faz o trabalho em vez disso.
Para preexec
, $1
é a linha de comando completa intocada. Nós apenas verificamos se começa com "my-batch "
, tira isso e enviamos o resto para batch
.
Isso explica por que my-batch
tem que estar no começo da linha. cmd && my-batch ...
não funcionará por exemplo, e você não pode fazer coisas como my-batch foo || bar
, porque ele realmente será interpretado como :|| foo || bar
.