AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 727972
Accepted
alper
alper
Asked: 2022-12-11 04:25:35 +0800 CST2022-12-11 04:25:35 +0800 CST 2022-12-11 04:25:35 +0800 CST

Como posso usar else para `ifne`?

  • 772

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 elsepara ifne?

bash
  • 4 4 respostas
  • 46 Views

4 respostas

  • Voted
  1. Kamil Maciorowski
    2022-12-11T05:24:27+08:002022-12-11T05:24:27+08:00
    ( ifne -n sh -c 'exec >&3; echo else' | ifne echo world ) 3>&1
    

    Se a entrada padrão não estiver vazia então ifne -nnão executará o sh …e agirá como cat, passando a entrada para o segundo ifne. O segundo ifneserá executado echo world. Isso é bastante simples.

    Se a entrada padrão estiver vazia, ifne -nserá executado sh …. A gente não podia simplesmente usar ifne -n echo else | …porque aí elseia chegar na segunda ifnee a gente pegava worldtambém. Portanto, costumamos 3>&1ter 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 de ifne -npara ifne. Para conseguir o que queremos, precisávamos redirecionar, echomas não ifne -na si mesmo; daí a casca interna.

    Você pode substituir echo elsepor outro(s) comando(s). Você pode substituir echo wordpor outro comando (que pode ser sh -c …se precisar de vários comandos). Meu ponto é que esta resposta não depende elseou worldestá sendo impressa; as substituições podem ou não ser silenciosas, não importa.

    • 2
  2. Best Answer
    Stewart
    2022-12-11T04:33:06+08:002022-12-11T04:33:06+08:00

    Na página de manual:

    -n Operação inversa. Execute o comando se a entrada padrão estiver vazia. Observe que se a entrada padrão não estiver vazia, ela é passada pelo ifne neste caso.

    $ printf "not-empty\n" | ifne    printf "This will print\n"
    This will print
    $ printf ""            | ifne    printf "This will not print\n"
    $ printf "not-empty\n" | ifne -n printf "This will not print\n"
    not-empty
    $ printf ""            | ifne -n printf "This will print\n"
    This will print
    

    Isso permite que você faça coisas como:

    $ dosoemthing | ifne -n printf "There was no output"
    

    Se você está procurando por um tipo de solução if-then-else, você pode canalizar stdout para teechamar duas instâncias de ifne:

    $ printf "if\n" | tee >(ifne printf "then\n") | ifne -n printf "else\n"
    if
    then
    $ printf ""     | tee >(ifne printf "then\n") | ifne -n printf "else\n"
    else
    

    Mas você também obtém o stdout original impresso. Isso é passar pelo ifne -nprocesso.

    • 1
  3. Stéphane Chazelas
    2022-12-11T09:49:23+08:002022-12-11T09:49:23+08:00

    Como complemento às respostas existentes, observe que ifnefunciona 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:

    input_available() {
      perl -MIO::Poll -e '
        $p = IO::Poll->new;
        $p->mask(STDIN, POLLIN);
        $p->poll or die "poll: $!\n";
        exit(1) unless $p->events(STDIN) & POLLIN;
        require "sys/ioctl.ph";
        $n = pack("L", 0);
        ioctl(STDIN, &FIONREAD, $n) or die"ioctl: $!\n";
        $n = unpack("L", $n);
        exit(1) unless $n > 0'
    }
    

    Então, você pode fazer:

    some-command |
      if input_available; then
        echo Input available:
        cat
      else
        echo No input available
      fi
    

    poll()no Linux sinaliza POLLINem 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.

    • 1
  4. Kusalananda
    2022-12-11T10:07:23+08:002022-12-11T10:07:23+08:00

    O pipeline

    somecommand | ifne echo something
    

    ... produz a saída (a string something) se somecommandgravar na saída padrão.

    Se o pipeline não produzir nenhuma saída, então somecommandnão produziu nenhuma saída. Isso pode ser capturado por ifne -n:

    somecommand | ifne echo something | ifne -n echo nothing
    

    Teste:

    $ printf 'ok' | ifne echo something | ifne -n echo nothing
    something
    $ printf '' | ifne echo something | ifne -n echo nothing
    nothing
    

    Observe que isso descarta a saída do comando mais à esquerda no pipeline. Isso pode ser remediado usando algo como

    ifne sh -c 'cat;echo something'
    

    ... 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.

    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve