On Fri, Jun 24, 2011 at 10:38, BX <daide...@gmail.com> wrote: > #/bin/bash > # file1 > import() > { > source file2 > } > > import > > echo v1=$v1, v2=$v2, v3=$v3 > > #/bin/bash > # file2 > v1=v1 > declare -x v2=v2 > declare v3=v3 > > Run above script by > $ bash file1 > > Expected result: v1=v1, v2=v2, v3=v3 > Real result: v1=v1, v2=, v3=
>From the documentation here: info '(bash)Shell Functions' we have: When the name of a shell function is used as a simple command name, the list of commands associated with that function name is executed. Shell functions are executed in the current shell context; no new process is created to interpret them. ... The BODY of the function is the compound command COMPOUND-COMMAND and from: info '(bash)Command Grouping' we have: Placing a list of commands between curly braces causes the list to be executed in the current shell context. No subshell is created. and from: info '(bash)Bourne Shell Builtins' we know that the `source' builtin works as follows: Read and execute commands from the FILENAME argument in the current shell context and from: info '(bash)Bash Builtins' we have When used in a function, `declare' makes each NAME local, as with the `local' command, unless the `-g' option is used. So, basically, the results are as expected: You execute the function `import', which executes `source file2' in the current shell context, which creates the variable `v1' in the current shell context, but creates the variables `v2' and `v3' local to the function being executed in the current shell context, so that by the echo statement, only `v1' is defined. Sincerely, Michael Witten