Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ignore failure on Source command in Bash script

So I know there are plenty of answers on stack overflow for ignoring errors in a bash script. None of them seem to work for the source command though.

I have tried the tried and true source ../bin/activate || true

I have tried setting set -e before running the command

I have tried source ../bin/activate 2>&1 /dev/null

I have tried setting set +e before running the command. This did not work either.

but on every run-through of this code, I receive

run.01: line 12: ../bin/activate: No such file or directory

The context for this problem is that I'm creating a simple bash script that runs some python code. The user is instructed for how to create a specific virtual environment and this line will automatically activate it if they set it up correctly, otherwise, this should ignore failing to activate running and continue running the commands in whatever environment is currently activated.

# 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

The python command should execute regardless of whether or not the source ../bin/activate command succeeds or not. I'm a little a loss for why none of these solutions are working and am currently under the assumption that source might do something different than a normal command given the circumstances.

EDIT:

I added the shebang #!/bin/bash -x to my file as requested but this did not do anything.

I this is my exact terminal output when I run this script.

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

Where run.01 is the name of the bash script.

Also to clarify, the code I showed is not censored. that is the entire script (except now with the mentioned shebang at the top.)

like image 464
Vapidant Avatar asked Jan 01 '23 08:01

Vapidant


2 Answers

This is a bug in Bash versions before 4.0 (macOS is stuck on 3.2).

Given this script:

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

Running on macOS will say:

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

While on a modern system with an updated bash version, you get the expected behavior:

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

If you need to support macOS and Bash 3.2, run set +e first to disable errexit, and optionally re-enable it afterwards.

like image 187
that other guy Avatar answered Jan 02 '23 23:01

that other guy


You could add a validation in your code to check whether the file exists before sourcing it :

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

Using the -f flag before a path will return true if the path file exists, and false if it doesn't.

The one liner syntax for bash if statements is as follow :

[[ Condition that returns true or false ]] && Exec if true 
like image 38
Dexirian Avatar answered Jan 02 '23 22:01

Dexirian