Shouldn't
execl()
replace the current shell with a new shell (and not spawn a new shell inside the old shell)?
Ele substitui o processo atual, que é o processo que executa seu programa, não o shell.
Quando você inicia seu programa, a árvore de processos se parece com
old shell → your program
Quando seu programa chama execl()
, essa árvore se torna
old shell → new shell
então quando você sair do shell, você retornará ao shell antigo.
Se você quiser substituir o shell antigo, você precisa dizer ao shell antigo para substituir a si mesmo pelo seu novo programa:
exec ./yourprogram
Em seguida, seu programa substituirá o novo shell, e você terá substituído o shell antigo pelo novo (com uma etapa extra envolvendo seu programa).