Нет необходимости в экспорте при выполнении функций в subshell

у меня есть 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, sourcing msource.sh или экспорт переменных по-прежнему не требуется.

однако вызов другого скрипта вsubshell теряет все переменные, и они должны быть экспортированы, даже файл журнала, который будет переопределен в противном случае.

может кто-нибудь прояснить, что происходит? Какая разница между выполнением функция в subshell и выполнение другого скрипта, который также будет запущен в другой subshell? Почему бы не экспортировать переменные родительского процесса в subshell функция ed?

5
задан Kamil Maciorowski
источник

1 ответов

Это дизайн. ответ на Unix & Linux SE объясняет проблему. Главное это:

подоболочка [...] отличается от выполнения скрипта.

1
отвечен Kamil Maciorowski 2017-07-10 08:54:00
источник

Другие вопросы bash daemon export pid shell-script