Resposta curta
Execute o script com source ou . :
source ./script_name.sh
ou
. ./script_name.sh
O último é um pouco mais compatível entre diferentes shells.
Resposta longa
Esta questão destaca um ponto importante, que é que os scripts de shell são executados em seu próprio contexto. Para ver o que isso significa, considere o seguinte script de shell:
#!/bin/bash
cd /
ls
Se você executar isto, você receberá uma saída como esta:
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
Mas você notará que depois de executar o script, você ainda está em qualquer diretório em que estava antes de executá-lo: o cd / dentro do script não afetou sua sessão - afetou apenas o contexto em que o script estava sendo executado, que é criado para o script ser executado e destruído quando retornar.
O comando source 'lerá e executará comandos do argumento filename no contexto atual do shell', portanto, qualquer comando como cd dentro dele afetará sua sessão atual. Se você tivesse que executar o script acima passando-o para source , descobriria que acabou no diretório raiz depois que ele foi executado.
Nesse caso, o problema é que o comando history fornece o histórico do contexto atual do shell; o contexto de shell em que seu script é executado sem usar source não possui histórico, portanto, ele não escreve nada no arquivo de saída. Se você usar source , ele será executado no contexto correto e funcionará como esperado.
NB: source é um shell embutido, não um programa per se - no Bash, source é sinônimo de . , mas em alguns shells somente . trabalho - usei source nesta resposta porque é mais fácil de ler que . , mas para compatibilidade máxima, . deve ser usado.