A maneira mais simples de pensar nisso é com:
exec < <(cat /path/to/script; echo 'exec </dev/tty')
Basicamente, o bash só vai acrescentar à história coisas que entram no STDIN. Então a solução é alimentar o script para STDIN. O problema é que, depois de ler o script, o bash receberá EOF e sairá. Para resolver isso, colocamos o exec </dev/tty
para que ele retorne o STDIN para o TTY quando terminar de ler o script.
Infelizmente isso significa que exec </dev/tty
será a última coisa em sua história, então você terá que passar por isso. Se você quiser, pode se livrar disso fazendo echo 'exec </dev/tty; history -d $((HISTCMD-1))'
. Mas começa a fazer o comando um pouco longo. Mas se você for adicionar uma função de shell personalizada para fazer isso, talvez não seja um grande problema. Por exemplo:
function infile() {
exec < <(cat "$1"; echo 'exec </dev/tty; history -d $((HISTCMD-1))')
}
O uso seria então:
infile /path/to/script