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 / 410750
Accepted
Philip Kirkbride
Philip Kirkbride
Asked: 2017-12-14 13:54:16 +0800 CST2017-12-14 13:54:16 +0800 CST 2017-12-14 13:54:16 +0800 CST

Suprimir erros em um subshell?

  • 772

Eu quero suprimir erros em meu sub-shell depois de um certo ponto.

Eu escrevi um script para demonstrar a situação:

worked=false
(echo Starting subshell process \
    && echo If this executes process is considered success \
    && false \
    && echo run if possible, but not an error if failed) \
  && worked=true

echo $worked

Quero relatar ao shell externo que o processo funcionou.

Também pensei em colocar a variável trabalhada dentro do subshell:

    && echo This works process worked: \
    && worked=true \
    && false \
    && echo run if possible, but not an error if failed)

Mas isso também não funciona porque definir uma variável dentro do subshell não afeta o script principal.

bash
  • 4 4 respostas
  • 1474 Views

4 respostas

  • Voted
  1. Best Answer
    roaima
    2017-12-14T14:09:10+08:002017-12-14T14:09:10+08:00

    Que tal agora

    worked=false
    (
        set -e
        echo Starting subshell process
        echo If this executes process is considered success
        false
        echo run if possible, but not an error if failed || true
    )
    [[ 0 -eq $? ]] && worked=true
    
    echo "$worked"
    

    O set -eencerra o subshell assim que um erro desprotegido é encontrado. A || trueconstrução protege uma instrução que pode falhar, onde você não deseja que o subshell termine.

    Se você quiser apenas saber se o subshell foi bem-sucedido, pode dispensar $workedtotalmente a variável

    (
        set -e
        ...
    )
    if [[ 0 -eq $? ]]
    then
        echo "Success"
    fi
    

    Observe que, se você deseja set -einterromper a execução no subshell assim que um comando falhar, não poderá usar uma construção como ( set -e; ... ) && worked=trueou if ( set -e; ...); then ... fi. Isso está documentado na página do manual, bashmas eu perdi na primeira vez:

    Se um comando composto ou função shell for definido -edurante a execução em um contexto em que -eé ignorado, essa configuração não terá nenhum efeito até que o comando composto ou o comando que contém a chamada de função seja concluído.

    • 7
  2. ilkkachu
    2017-12-14T14:16:43+08:002017-12-14T14:16:43+08:00

    Você poderia colocar os comandos obrigatórios na condição de um if, sem precisar conectar tudo com uma &&chain:

    worked=false
    (   if echo Starting subshell process &&
           echo If this executes process is considered success ; then
            false &&
            echo run if possible, but not an error if failed
            exit 0
        fi
        exit 1 ) && worked=true
    
    echo worked=$worked
    
    • 1
  3. Bruce
    2017-12-14T14:20:40+08:002017-12-14T14:20:40+08:00
    worked=false
    (status=1;
        echo Starting subshell process \
        && echo If this executes process is considered success \
        && status=0
        && false \
        && echo run if possible, but not an error if failed;
        exit $status) \
      && worked=true
    
    echo $worked
    
    • 1
  4. Philip Kirkbride
    2017-12-14T14:12:29+08:002017-12-14T14:12:29+08:00

    Minha solução foi criar uma variável dentro do subshell e controlar manualmente os códigos de saída com base nisso:

    worked=false
    (echo Starting subshell process \
        && echo If this executes process is considered success \
        && check=true \
        && false \
        && echo run if possible, but not an error if failed
      if [[ -n "$check" ]]; then exit 0; else exit 1; fi) \
      && worked=true
    
    echo $worked
    
    • 0

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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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