
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 alias
definição e fazer
alias xyz='{ command1; command2; }'
Nesse caso, você comamnd1
obté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 bash
ou zsh
suportar substituição de processo, você pode apenas definir command2
para 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 pqr
com command2
argumento de entrada
Responder3
Para passar algo para a entrada padrão command2
na lista de comandos
command1; command2
você teria que ter certeza de que command1
não lê a entrada padrão. Isso pode ser feito redirecionando a entrada padrão /dev/null
para 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 xyz
como uma função shell:
xyz () {
command1 </dev/null
command2 "$@"
}
Aqui, command2
obterí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 command2
dizem "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)