Игнорировать сбой команды Source в скрипте Bash

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

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

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

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

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

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

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

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

# 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 ../bin/activate или нет. Я немного растерялся из-за того, что ни одно из этих решений не работает, и в настоящее время я предполагаю, что source может сделать что-то отличное от обычной команды, учитывая обстоятельства.

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

Я добавил в файл файл shebang #!/bin/bash -x но это не помогло.

Я это мой точный вывод терминала, когда я запускаю этот скрипт.

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.

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

Всего 2 ответа


Это ошибка в версиях 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, а затем, при необходимости, повторно включите его.


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

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

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

Единый синтаксис для команд bash if выглядит следующим образом:

[[ Condition that returns true or false ]] && Exec if true 

Есть идеи?

10000