1

For some reason after running the main script:

sudo bash main.sh

-> execution stops at the first diff redirected to file.

However, when I comment out the function name and parentheses and call the patching.sh directly - it works.

What is wrong with my script that when calling it in a form of a function from another file - it stops, but when called directly it works?

main.sh:

set -e
source $(dirname $0)/Scripts/patching.sh
# Overwrite files 
update_files

patching.sh:

#!/bin/bash

function update_files() {

    declare -r SW_DIR='Source/packages/'

    CMP_FILE='file1.c'
    diff -u ./$SW_DIR/examples/$CMP_FILE ./Source/$CMP_FILE > file.diff
    cp -v ./Source/$CMP_FILE ./$SW_DIR/examples/$CMP_FILE

}

During my debugging - I added the -x option to set. This is what I see now:

+ declare -r SW_DIR=Source/packages
+ CMP_FILE=file1.c
+ diff -u ./Source/packages/examples/file1.c ./Source/file1.c

And that's the last line. If I omit the redirection operator - the diff is simply shown in the console and that's it. It does not proceed further, with no error message.

Peter Cerba
  • 806
  • 4
  • 14
  • 26

1 Answers1

1

See What does set -e mean in a bash script? and BashFAQ/105 (Why doesn't set -e (or set -o errexit, or trap ERR) do what I expected?). Execution stops after the diff when set -e is in effect because diff exits with non-zero status when the files that it is comparing are different. This kind of behaviour is one of the downsides of using set -e. Follow the links for more, and useful, information.

pjh
  • 6,388
  • 2
  • 16
  • 17