passando comandos compostos como argumentos

1

Considere um script pass_command

ls | "$@"

Aceita comandos nomeados como argumentos

pass_command sort
#prints files sorted

O que é bom o suficiente para todos os fins práticos. Estou curioso, porém, existe um mecanismo que me permite passar comandos compostos? Algo como

pass_command (sort | uniq) #Forgive the silly example.

Editar: Um exemplo mais complicado que motivou essa questão.

until who | grep mary
do
  sleep 60
until

Signals mary fazendo logon. Eu queria generalizar isso para sinalizar algum evento. A ideia intuitiva foi esta:

#watchfor
until "$@"
do
  sleep 60
done

E então você chamaria isso de

watchfor (who | grep mary)

Essa foi a ideia. Você pode dar um nome ao argumento, e o acima funciona bem. Isso só me fez pensar nisso.

Suponho que eu estava tentando entender a maneira mais idiomática de ocultar o comando de sinalização.

    
por Polymer 19.04.2017 / 19:40

1 resposta

2

Você teria que usar eval no script assim que $@ fosse mais do que um comando simples (o argumento para o script deve ser passado como uma string entre aspas):

ls | eval "$@"

Mas, novamente, isso também seria o mesmo que

pass_command sort | uniq

, por exemplo, você passa o comando sort e o uso uniq na saída.

Eu não vejo nenhum uso real para este tipo de script ou função, já que a capacidade de pipelining do Unix parece cobrir a maioria das aplicações práticas.

    
por 19.04.2017 / 19:47