Текст справки Bash для.
:
.:. 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.
Обратите внимание на фразу :", если предоставлены какие-либо аргументы". Без аргументов текущие позиционные параметры остаются.
$ cat /tmp/sourceme.sh
printf "%d: " "$#"
printf "<%s> " "$@"
printf "\n"
$ bash -c 'set -- aa bb;. /tmp/sourceme.sh'
2:
$ bash -c 'set -- aa bb;. /tmp/sourceme.sh foo bar'
2:
Все другие протестированные мной оболочки (zsh, ksh )ведут себя аналогично. За исключением dash
, который всегда оставляет исходные позиционные параметры на месте.
$ dash -c 'set -- aa bb;. /tmp/sourceme.sh foo bar'
2:
Я не вижу никакого упоминания о сбросе позиционных параметров в определении POSIX для .
, поэтому может показаться, что предоставление аргументов для .
нестандартно с самого начала.
Вместо исходного сценария вы можете использовать функцию, так как они могут принимать аргументы в стандартной оболочке. В этом случае вы должны получить файл, определяющий функцию.
. файл(define_fun.sh
)с определением функции:
#!/bin/sh
f() {
echo "args: $# $@" # just a test
if [ "$#" = 0 ]; then
echo please give at least one argument
return 1
fi;
ENVVAR=$1 # this should be visible to the whole shell
export ENVVAR # and any commands called later
}
А потом использовать:
$. define_fun.sh # source the file to load the func in the current shell
$ f # actually run it: this'll complain
$ f 123 456 # this should set ENVVAR
$ echo $ENVVAR # and this will print '123'
Вместо этого вы могли бы поместить определение функции в один из файлов инициализации оболочки(~/.profile
?Зависит от оболочки.)