O source
incorporado do Bash usa apenas um único nome de arquivo:
source filename [arguments]
Qualquer coisa além do primeiro parâmetro se torna um parâmetro posicional para filename
.
Uma ilustração simples:
$ cat myfile
echo "param1: $1"
$ source myfile foo
param1: foo
Saída completa de help source
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
(Isto também se aplica ao equivalente "dot source" embutido em .
, que, vale a pena notar, é o modo POSIX e, portanto, mais portátil.)
Quanto ao comportamento aparentemente contraditório que você está vendo, você pode tentar executar main.sh depois de fazer set -x
. Ver quais instruções estão sendo executadas e quando podem fornecer uma pista.