Por que não usar subpastas nativas?
$ ( ls; pwd; exec $BASH; )
bar foo howdy
/tmp/hello/
bash-4.4$
bash-4.4$ exit
$
Colocar comandos com parênteses faz com que o bash crie um subprocesso para executar esses comandos, para que você possa, por exemplo, alterar o ambiente sem afetar o shell pai. Isso é basicamente mais legível equivalente ao bash -c "ls; pwd; exec $BASH"
.
Se isso ainda parecer detalhado, existem duas opções. Uma é ter esse trecho como uma função:
$ run() { ( eval "$@"; exec $BASH; ) }
$ run 'ls; pwd;'
bar foo howdy
/tmp/hello/
bash-4.4$ exit
$ run 'ls;' 'pwd;'
bar foo howdy
/tmp/hello/
bash-4.4$ exit
$
Outra é tornar exec $BASH
mais curto:
$ R() { exec $BASH; }
$ ( ls; pwd; R )
bar foo howdy
/tmp/hello/
bash-4.4$ exit
$
Eu pessoalmente gosto de R
se aproximar mais, já que não há necessidade de tocar com strings de escape.