Нет необходимости в экспорте при запуске функций в подоболочке
У меня есть msource.sh
скрипт, который будет поставлен:
$ cat msource.sh
#!/usr/bin/env sh
echo "($BASHPID) - sourced ${BASH_SOURCE[0]}" &>> "$logfile"
# logfile is defined by the sourcing script
sourced_var="init sourced var with $BASHPID"
У меня есть скрипт, который будет источником msource.sh
и позвонить function
как есть и в subshell
, Затем он вызовет другой скрипт mscript2.sh
:
$ cat mscript.sh
#!/usr/bin/env sh
logfile=mout.out
rm -f $logfile
source msource.sh
mfun() {
echo "($BASHPID) in ${FUNCNAME}" &>> "$logfile"
echo " avar: '$avar'" &>> "$logfile"
echo " sourced_var: '$sourced_var'" &>> "$logfile"
}
avar="$BASHPID - init"
echo "[mfun] basic call" &>> "$logfile"
mfun
echo -e "\n[mfun &] subshell call" &>> "$logfile"
mfun &
wait $!
## call mscript2.sh
echo -e "\n[mscript2] background call" &>> "$logfile"
bash mscript2.sh &
wait $!
# call mscript2.sh after exporting variables
echo -e "\n[mscript2 &] export and background call" &>> "$logfile"
export logfile
export avar
export sourced_var
bash mscript2.sh &
wait $!
У меня есть другой сценарий, mscript2.sh
это будет называться mscript.sh
как видно выше:
$ cat mscript2.sh
#!/usr/bin/env sh
[ -z "${logfile:+x}" ] && logfile=mout2.out || true
echo "($BASHPID) - executing ${BASH_SOURCE[0]}" &>> "$logfile"
echo " avar: '$avar'" &>> "$logfile"
echo " sourced_var: '$sourced_var'" &>> "$logfile"
Я запускаю все:
$ bash script.sh
Я получаю следующие выводы:
$ cat mout.out
(13166) - sourced msource.sh
[mfun] basic call
(13166) in mfun
avar: '13166 - init'
sourced_var: 'init sourced var with 13166'
[mfun &] subshell call
(13174) in mfun
avar: '13166 - init'
sourced_var: 'init sourced var with 13166'
[mscript2 &] background call
[mscript2 &] export and background call
(13184) - executing mscript2.sh
avar: '13166 - init'
sourced_var: 'init sourced var with 13166'
а также
$ cat mout2.out
(13179) - executing mscript2.sh
avar: ''
sourced_var: ''
Поэтому, если я вызываю функцию как есть, pid
то же самое, и мне не нужен источник msource.sh
ни экспортировать переменные. Если я вызываю функцию в subshell
, поиск msource.sh
или экспорт переменных по-прежнему не требуется.
Однако, вызывая другой скрипт вsubshell
теряет все переменные, и они должны быть экспортированы, даже файл журнала, который будет переопределен в противном случае.
Может кто-нибудь уточнить, что происходит? В чем разница между выполнением функции в subshell
и выполнение другого скрипта, который также будет запущен в другом subshell
? Почему не нужно экспортировать переменные родительского процесса для передачи subshell
Эд функция?
1 ответ
Это по замыслу. Этот ответ на Unix & Linux SE объясняет проблему. Основным моментом является:
Подоболочка […] отличается от выполнения скрипта.