Игнорировать сбой в исходной команде в сценарии Bash - PullRequest
2 голосов
/ 15 января 2020

Итак, я знаю, что существует множество ответов на переполнение стека для игнорирования ошибок в bash сценарии. Похоже, что ни один из них не работает для исходной команды.

Я попробовал проверенный и верный source ../bin/activate || true

Я пытался установить set -e перед выполнением команды

Я пытался source ../bin/activate 2>&1 /dev/null

Я пытался установить set +e перед запуском команды. Это тоже не сработало.

, но при каждом запуске этого кода я получаю

run.01: строка 12: ../bin/activate: такого файла нет или каталог

Контекст этой проблемы заключается в том, что я создаю простой сценарий bash, который выполняет некоторый код python. Пользователь получает инструкции о том, как создать определенную виртуальную среду c, и эта строка автоматически активирует ее, если он настроит ее правильно, в противном случае следует игнорировать сбой при запуске и продолжение выполнения команд в любой среде, которая активирована в данный момент.

# Try virtual environment

source ../bin/activate || true

## Run.

code="../src-01/driver.v01.py"

## --------------------
graphInputFile="undirected_graph_01.inp"
graphType="undirected"
srcColId="0"
desColId="1"
degreeFind="2"
outFile="count.undirected.num.nodes.out"

python $code  -inpGraphFile $graphInputFile  -graphFormat $graphType  -colSrcId $srcColId -colDesId $desColId  -degreeFind $degreeFind  -output_file $outFile

Команда python должна выполняться независимо от того, успешно выполнена команда source ../bin/activate или нет. Я немного растерялся из-за того, что ни одно из этих решений не работает, и в настоящее время я предполагаю, что source может сделать что-то отличное от обычной команды, учитывая обстоятельства.

РЕДАКТИРОВАТЬ:

Я добавил shebang #!/bin/bash -x в свой файл по запросу, но это ничего не сделало.

I Это мой точный вывод на терминал при запуске этого скрипта.

Lucas-Macbook:test-01 lucasmachi$ sh run.01
run.01: line 14: ../bin/activate: No such file or directory
Lucas-Macbook:test-01 lucasmachi$ 

Где run.01 - это имя сценария bash.

Также поясним, что показанный мной код не подвергается цензуре. это весь сценарий (за исключением теперь с упомянутым Шебангом наверху.)

Ответы [ 3 ]

5 голосов
/ 16 января 2020

Это ошибка в Bash версиях до 4.0 (macOS зависла на 3.2).

С учетом этого сценария:

#!/bin/bash
set -e
echo "Running $BASH_VERSION"
source "does not exist" || true
echo "Continuing"

Запуск на macOS скажет:

macos$ ./myscript
Running 3.2.57(1)-release
./myscript: line 3: does not exist: No such file or directory

Находясь в современной системе с обновленной версией bash, вы получите ожидаемое поведение:

debian$ ./myscript
Running 5.0.11(1)-release
./myscript: line 3: does not exist: No such file or directory
Continuing

Если вам требуется поддержка macOS и Bash 3.2, запустите set +e сначала отключите errexit, а затем при необходимости включите его снова.

3 голосов
/ 16 января 2020

Вы можете добавить проверку в свой код, чтобы проверить, существует ли файл перед его поиском:

[[ -f "../bin/activate" ]] && source ../bin/activate

Использование флага -f перед путем вернет true, если файл пути существует, и false, если файл существует. это не так.

Синтаксис с одной строкой для bash, если операторы следующие:

[[ Condition that returns true or false ]] && Exec if true 
0 голосов
/ 18 апреля 2020

Я столкнулся с этой проблемой с конвейерами gitlab. Ничто из вышеперечисленного не помогло мне, но объединение ответов сработало:

[[ -f "${ENVIRONMENT}_test" ]] && source "${ENVIRONMENT}_test" || true

Это приведет меня туда, где мне нужно go, надеюсь, это поможет кому-то в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...