Проблема root - это аномалия в работе команды source
. Из справочной страницы bash в разделе «Команды встроенной оболочки»:
. имя файла [ аргументы ]
источник имя файла [ аргументы ]
[...] Если есть аргументы предоставляются, они становятся позиционными параметрами при выполнении filename . В противном случае позиционные параметры не изменяются.
... что означает, что вы можете переопределить аргументы основного скрипта, предоставив разные аргументы скрипту source
d, но вы не можете просто не передайте аргументы ему.
К счастью, есть обходной путь; просто source
скрипт в контексте, где нет аргументов:
#!/bin/bash
wrapperfunction() {
source ./a.sh
}
wrapperfunction
Поскольку аргументы для wrapperfunction
не передаются, в нем список аргументов пуст. Поскольку команды a.sh
выполняются в этом контексте, список аргументов там также пуст. И переменные, назначенные внутри a.sh
, доступны вне функции (если они не объявлены как local
или что-то подобное).
(Примечание: я проверял это в bash, zsh, da sh, и ksh93, и он работает во всех них - хорошо, за исключением того, что da sh не имеет команды source
, поэтому вы должны использовать .
.)