Subshells herdam o ambiente ou parte dele. Parece que quando você executa uma função em um subshell, você não precisa que suas variáveis sejam exportadas (compare: Não é necessário para exportação ao executar funções em subshell ). Pode haver alguns casos em que você precisa de export
, mas vamos nos concentrar em seu exemplo.
Sua abordagem é falha e difícil de manter porque a herança é unidirecional. Todo (mfunc)
herda tmp_tmp_files
e trabalha com sua própria cópia da matriz. Não há como modificar o tmp_tmp_files
original usado no script principal. Portanto, o script principal não pode limpar tudo, apenas não possui informações suficientes.
Se você optar por limpar a função subshelled, precisará prestar atenção e separar os arquivos temporários da função dos arquivos temporários do script principal. A remoção prematura do último pode causar falha no script.
Abordagem alternativa: um diretório temporário
-
Em vez de criar uma matriz, crie um diretório e lembre-se do caminho. Faça isso uma vez no começo e
export
se precisar:tempdir=$(mktemp -d mscript.XXXXXXXXXX)
-
Crie todos os arquivos temporários dentro do diretório temporário, assim:
tempfile=$(mktemp -p "$tempdir")
-
No final, remova o diretório inteiro, não importando se os arquivos foram criados pelo script principal ou por um subshell, ou até mesmo por algum programa de terceiros. Você pode usar uma armadilha para realizar essa etapa. Simplesmente:
rm -r "$tempdir"