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.