Execute o comando com base no resultado do comando anterior (sem falhar na instrução inteira)

1

Eu gostaria de fazer algo assim:

gatekeeper.sh && <script>

gatekeeper.sh determina se < script > será executado ou não retornando 0 ou 1 dependendo de certas condições - o que funciona até agora, mas:

  1. o comando inteiro deve falhar (status de saída! = 0) se o gatekeeper.sh for bem-sucedido, mas o < script > não faz
  2. o comando inteiro deve não falhar se o gatekeeper.sh falhar (e o segundo comando não for executado)
  3. < script > não deve ser alterado

Se possível, eu gostaria de manter a sintaxe o mais curta possível para melhor legibilidade

    
por kev 07.03.2017 / 21:16

3 respostas

4

If possible I would like to keep the syntax as short as possible for better readability

Neste caso, penso que "o mais curto possível" é "melhor legibilidade". Mesmo se eu pudesse pensar em uma sintaxe && e empresa que faz o que você quer, eu suspeito que seria difícil ver de relance o que o autor do código pretendia.

Acho que este é um caso em que você deseja uma declaração extra para maior clareza:

if gatekeeper.sh; then
    <script>
fi

Até certo ponto, o código mais legível é provavelmente influenciado pela lógica de negócios. Que construção traduz essa intenção lógica em código de forma mais transparente?

    
por 07.03.2017 / 22:06
0

Colocando minha abordagem em discussão. Estou ciente de que eval é mal (às vezes) mas eu confio nos comandos sendo executados.

gatekeeper.sh

#!/usr/bin/bash

if [[ <condition> ]]; then
    eval "$1"
    exit "$?"
fi

Uso: gatekeeper.sh "<command>"

    
por 08.03.2017 / 02:41
0

Você pode capturar o status de saída do gatekeeper.sh em uma variável e usá-lo posteriormente em um exit (ou return se for uma função em vez de um script)

#!/bin/sh
gatekeeper.sh
status=$?
[ "$status" != 0 ] && <script>
exit "$status"
    
por 08.03.2017 / 02:52