ifne
- Execute o comando se a entrada padrão não estiver vazia
Se possível, desejo executar o comando se a entrada padrão também estiver vazia; outra seção para ifne
.
$ printf "hello" | ifne echo "world"
world
Aqui, se a entrada padrão estiver vazia, quero terminar em uma instrução diferente.
$ printf "" | ifne echo "world" || echo "else"
mas não imprime nada. É possível ter else
para ifne
?
Se a entrada padrão não estiver vazia então
ifne -n
não executará osh …
e agirá comocat
, passando a entrada para o segundoifne
. O segundoifne
será executadoecho world
. Isso é bastante simples.Se a entrada padrão estiver vazia,
ifne -n
será executadosh …
. A gente não podia simplesmente usarifne -n echo else | …
porque aíelse
ia chegar na segundaifne
e a gente pegavaworld
também. Portanto, costumamos3>&1
ter a saída padrão de todo o snippet disponível antes mesmo de|
. Está disponível como descritor de arquivo 3.ifne -n echo else >&3 | …
quebraria o caso de entrada não vazia, onde os dados devem ir deifne -n
paraifne
. Para conseguir o que queremos, precisávamos redirecionar,echo
mas nãoifne -n
a si mesmo; daí a casca interna.Você pode substituir
echo else
por outro(s) comando(s). Você pode substituirecho word
por outro comando (que pode sersh -c …
se precisar de vários comandos). Meu ponto é que esta resposta não dependeelse
ouworld
está sendo impressa; as substituições podem ou não ser silenciosas, não importa.Na página de manual:
Isso permite que você faça coisas como:
Se você está procurando por um tipo de solução if-then-else, você pode canalizar stdout para
tee
chamar duas instâncias deifne
:Mas você também obtém o stdout original impresso. Isso é passar pelo
ifne -n
processo.Como complemento às respostas existentes, observe que
ifne
funciona tentando ler de stdin e, se algo estiver chegando, ele inicia o comando e transfere os dados para ele em um loop por meio de um tubo.No entanto, para a maioria dos tipos de entrada, deve ser possível detectar se há alguma entrada sem ter que lê-la, o que salvaria o processamento da extração e evitaria o pipe.
Por exemplo, você pode definir um:
Então, você pode fazer:
poll()
no Linux sinalizaPOLLIN
em pipes apenas quando há alguns dados, mas esse não é o caso de todos os sistemas, pois alguns também sinalizam POLLIN no final do arquivo. Daí o FIONREAD ioctl para verificar se realmente há dados. Esse ioctl não funciona em todos os tipos de entrada. Por exemplo, no Linux, acho que não funciona no/dev/null
. Ele funciona em arquivos regulares, pipes e dispositivos tty, pelo menos.O pipeline
... produz a saída (a string
something
) sesomecommand
gravar na saída padrão.Se o pipeline não produzir nenhuma saída, então
somecommand
não produziu nenhuma saída. Isso pode ser capturado porifne -n
:Teste:
Observe que isso descarta a saída do comando mais à esquerda no pipeline. Isso pode ser remediado usando algo como
... como o segundo comando do pipeline, onde
cat
é qualquer comando que deve receber a saída do lado esquerdo.Isso também depende do fato de que o último comando não recebe nenhuma entrada no caso em que o primeiro comando não produz nenhuma saída.