эквивалент выхода из командной строки - PullRequest
2 голосов
/ 03 августа 2020

У меня есть сценарий bash, который запускает серию сценариев python. Он всегда запускает их все, но завершает работу с кодом ошибки, если какой-либо сценарий завершился с кодом ошибки. По крайней мере, я на это надеюсь. Вот он ...

#!/bin/bash

res=0

for f in scripts/*.py
do
  python "$f";
  res=$(( $res | $? ))
done

exit $res

Я хотел бы запустить это как команду bash в терминале, но я не могу понять, как заменить exit, чтобы команда не сработала как неудачный сценарий, а не выходит из терминала. Как мне это сделать?

Ответы [ 4 ]

3 голосов
/ 03 августа 2020

Замените последнюю строку exit $res на

$(exit ${res})

Это завершает порожденную подоболочку со значением выхода ${res}, и, поскольку это последний оператор, это также значение выхода вашего скрипта .

2 голосов
/ 03 августа 2020

Bash не имеет концепции анонимных функций (например, Go), которые вы можете определить встроенными и получить возвращаемое значение, вам нужно сделать это явно. Оберните весь код в функцию, скажем f()

f() {
    local res=0
    
    for f in scripts/*.py
    do
      python "$f";
      res=$(( $res | $? ))
    done

    return $res
}

, и используйте код выхода в командной строке.

if ! f; then
    printf '%s\n' "one more python scripts failed"
fi
0 голосов
/ 03 августа 2020
#!/bin/bash

for f in scripts/*.py
do
  python "$f" && echo "1" >> stack || echo "0" >> stack
done

[ $(grep -o stack) -eq 0 ] && rm -v ./stack && exit 1

В данный момент я довольно обкурен, поэтому прошу прощения, если неправильно интерпретирую, но я верю, что это сделает то, что вам нужно. Каждый раз, когда сценарий python возвращает код ошибки 0 (что означает, что он работает), в файл стека выводится 1. В конце l oop стек проверяется на наличие единственного 0, и, если он обнаруживается, завершается с кодом ошибки 1, который предназначен для общих ошибок.

0 голосов
/ 03 августа 2020

Верно ли, что значение кода ошибки не имеет значения. Тогда у меня есть другое решение:

#!/bin/bash
total=0
errcount=0

for f in scripts/*.py
do
  let total++
  python "$f" || let errcount++
done

if ((errcount))
then
  printf '%u of %u scripts failed\n' $errcount $total >&2 
  exit 1
fi

exit 0
...