Como passo a entrada canalizada para o segundo comando em um alias?

Como passo a entrada canalizada para o segundo comando em um alias?

Eu defini um alias como:

alias xyz='command1; command2'

Quero canalizar a saída de outro comando pqr para command2 como:

pqr | xyz -f -

É possível? Como posso conseguir isso?

Responder1

Usar um alias geralmente énãoboas práticas em scripts de shell não interativos (BashFAQ/080). Da maneira como você tem o alias definido em seu OP, apenas os primeiros comandos são lidos na entrada padrão, porque ;impede que sua entrada padrão vá além do seu primeiro comando.

Uma maneira possível é agrupar comandos usando {..}, para que quaisquer redirecionamentos se apliquem a todo o conjunto de comandos dentro do grupo. Você ainda pode manter sua aliasdefinição e fazer

alias xyz='{ command1; command2; }'

Nesse caso, você comamnd1obtém desnecessariamente uma cópia da entrada padrão. Você pode fechá-lo fazendo

alias xyz='{ command1 < /dev/null ; command2 - ; }'

Ou use funções para definir seus comandos.

xyz() {
    command1; command2
}

Se o seu shell for bashou zshsuportar substituição de processo, você pode apenas definir command2para receber conteúdo stdin como argumentos posicionais. Redefina sua função como

xyz() {
    command1
    command2 "$@"
}

e então chame seu comando ( pqr) como

xyz < <(pqr)

Uma simples demonstração do que foi dito acima,

zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food)                     #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood

Responder2

Eu sugiro que você tente a abordagem xargs, ou seja:

alias xyz='command1; command2 | xargs pqr'

Isso é equivalente a executar pqrcom command2argumento de entrada

Responder3

Para passar algo para a entrada padrão command2na lista de comandos

command1; command2

você teria que ter certeza de que command1não lê a entrada padrão. Isso pode ser feito redirecionando a entrada padrão /dev/nullpara command1:

command1 </dev/null; command2

Isso deixa você com o alias

alias xyz='command1 </dev/null; command2`

que você farianãopoder ligar com

pqr | xyz -f -

pois isso seria equivalente a

pqr | command1 </dev/null; command2 -f -

que é o mesmo que

pqr | command1 </dev/null
command2 -f -

Em vez disso, defina xyzcomo uma função shell:

xyz () {
    command1 </dev/null
    command2 "$@"
}

Aqui, command2obteríamos a entrada padrão da função, bem como quaisquer argumentos de linha de comando fornecidos à função.

Agora você poderá usar isso como no pipeline pqr | xyz -f -.

Se (e somente se) os -f -argumentos para os quais você passa command2dizem "ler a partir da entrada padrão" (denotando -a entrada padrão), então você pode, em vez de -passar uma substituição de processo para xyz, se o seu shell suportar:

xyz -f <(pqr)

Com a função acima, isso seria o mesmo que fazer

command1 </dev/null
command2 -f <(pqr)

informação relacionada