Estou usando o zsh e tenho esta função:
function timer-raw() {
# Just think `loop fsayd` is `echo hi` for the purposes of this question.
eval "sleep $((($1)*60))" && eval ${(q+@)@[2,-1]:-loop fsayd}
}
timer-raw
o primeiro argumento de diz quantos minutos esperar; O restante dos argumentos, se presentes, seriam eval
editados como se digitados na linha de comando, após a espera:
timer 3 echo sth
# After 3 minutes, echoes `sth`.
No entanto, se nenhum argumento adicional for fornecido, quero que ele execute o comando padrão loop fsayd
:
timer 4
# runs `loop fsayd` after 4 minutes
O problema é que quero loop fsayd
ser substituído por duas palavras, mas não sei como. Eu tentei essas variações também, mas elas também não funcionaram:
"${(q+@)${@[2,-1]:-loop fsayd}}"
"${(q@)${(q@)=@[2,-1]:-loop fsayd}}"
"${(qq@)=@[2,-1]:-loop fsayd}"
Por "não funcionou", quero dizer que um simples timer 0
falharia por um command not found
, ou que timer 0 ff hi 'man hi jk k'
falhou ao retornar o número correto de argumentos de entrada. ( ff() echo "$#"
)
Nota: eu não quero usar test -z "${@[2,-1]}"
.
Se não há problema em definir os padrões em uma variável, você deve ser capaz de fazer:
Pessoalmente, eu não usaria eval e apenas faria:
Lol eu entendi:
Isso substitui (
${name/pattern/repl}
) o conteúdo da variável inexistente chamada "" (nada) -- que é uma string vazia -- substituindo o início da string (vazia) (pattern#
) pelo loop fsayd, enquanto faz a divisão de palavras (options(z)
) ..... :D