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 / 694439
Accepted
Erwann
Erwann
Asked: 2022-03-15 21:51:52 +0800 CST2022-03-15 21:51:52 +0800 CST 2022-03-15 21:51:52 +0800 CST

Como dizer ao `xargs` para ignorar stdout vazio?

  • 772

Como esse código pode ser alterado para não dar erro, ou seja, não executar o código depois xargsse stdout estiver vazio.

Terminal:

$ cat << EOF > dummy.sh
#! /usr/bin/env bash
[[ -f "\$1" ]] &&  echo "file=\$1" || { echo "error"; exit 1; } 
shift 
(( \$# == 0 )) || "\$0" "\$@" 
EOF
$ chmod +x dummy.sh
$ mkdir trash.later && touch trash.later/foo
$ find trash.later -type f | xargs -n 1 ./dummy.sh 
file=trash.later/foo
$ find trash.later -type f | grep 'bar' | xargs -n 1 ./dummy.sh 
error
xargs
  • 1 1 respostas
  • 505 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2022-03-15T22:03:17+08:002022-03-15T22:03:17+08:00

    Não use xargsna saída de find. xargspor padrão, espera que os argumentos na entrada sejam delimitados em um formato que nenhum comando produza, certamente não find. A saída de find -printtambém não é pós-processável de forma confiável.

    A única maneira de usar findde xargsforma confiável é usando as extensões -print0e -0não padrão (inicialmente do GNU find/ xargs, mas hoje em dia encontradas em muitas outras implementações).

    O GNU xargstambém possui uma extensão -r/ --no-run-if-emptypara não executar o comando se a entrada estiver vazia (algumas xargsimplementações como a do NetBSD fazem isso por padrão).

    Então aqui, com GNU find// xargsou grepcompatível, você poderia fazer:

    find trash.later -type f -print0 |
      grep -z bar |
      xargs -r -0 -n 1 ./dummy.sh
    

    Mas isso não tem vantagem sobre o padrão:

    find trash.later -path '*bar*' -type f -exec ./dummy.sh {} ';'
    

    (onde -path '*bar*'procura em barqualquer lugar no caminho do arquivo como você grep bartentou fazer. Substitua por -name '*bar*'procurar barapenas no nome do arquivo (o último componente de seu caminho)).

    Mais leitura sobre isso em Por que o loop sobre a saída de find é uma prática ruim?


    Como uma resposta mais geral à sua pergunta, para xargsimplementações que não suportam -r/ --no-run-if-empty, a solução é usar um shwrapper.

    Ao invés de:

    ... | xargs -n1 cmd
    

    Faz:

    ... | xargs sh -c 'for file do cmd "$file"; done' sh
    

    Isso ainda é executado shse não houver entrada, mas como a lista de argumentos está vazia, não haverá passagem no loop, portanto cmd, não será executado.

    Veja também o ifnecomando a partir do moreutilsqual só executa o comando se a entrada não estiver vazia

    ... | ifne xargs -n1 cmd
    

    No entanto, observe que se a entrada não estiver vazia, mas contiver apenas linhas em branco, ifneserá executado , xargsmas xargsainda considerará que sua entrada não tem argumento e ainda será executado cmduma vez sem argumento (exceto no NetBSD).

    Para completar

    ... | xargs -I {} cmd {}
    

    também não será executado cmdse a entrada estiver vazia/em branco. Nesse caso, a divisão da entrada em argumentos é diferente: os espaços em branco iniciais são removidos, as aspas ainda são processadas (de xargsuma maneira muito própria), mas, caso contrário, os argumentos são linhas inteiras em vez de palavras separadas em branco.

    • 3

relate perguntas

  • Como usar xargs com um comando que requer entrada do usuário?

  • Como fornecer uma lista separada por vírgulas como argumentos para o próximo comando

  • O que há de errado com este comando xargs?

  • Como usar a saída de ls para abrir o último arquivo modificado?

  • Xargs Opção `-J`

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