Подоболочки наследуют окружающую среду или ее часть. Похоже, что когда вы выполняете функцию в подоболочке, вам не нужно экспортировать переменные (сравните: нет необходимости в экспорте при запуске функций в подоболочке ). Могут быть случаи, когда вам нужно, export
но давайте сосредоточимся на вашем примере.
Ваш подход некорректен и его будет сложно поддерживать, потому что наследование идет в одну сторону. Каждый (mfunc)
наследует tmp_tmp_files
и работает со своей копией массива. Нет способа изменить оригинал, tmp_tmp_files
используемый в основном скрипте. Поэтому основной скрипт не может очистить все, он просто не обладает достаточным количеством информации.
Если вы решите очистить функцию subhelled, вам нужно будет обратить внимание и отделить временные файлы функции от временных файлов основного скрипта. Преждевременное удаление последнего может привести к сбою сценария.
Альтернативный подход: временный каталог
Вместо создания массива создайте каталог и запомните его путь. Сделайте это один раз в начале, и
export
если вам нужно:tempdir=$(mktemp -d mscript.XXXXXXXXXX)
Создайте каждый временный файл во временном каталоге, например так:
tempfile=$(mktemp -p "$tempdir")
В конце удалите весь каталог, независимо от того, были ли определенные файлы созданы основным сценарием или подоболочкой, или даже какой-то сторонней программой. Вы можете использовать ловушку для выполнения этого шага. Просто:
rm -r "$tempdir"