Crie HISTFILE em subshell

0

Aqui está o meu HISTFILE:

$ echo $HISTFILE
/home/Steven/.bash_history

Eu posso criá-lo usando exit:

$ [ -e $HISTFILE ]; echo $?
1

$ exit

$ [ -e $HISTFILE ]; echo $?
0

No entanto, se eu sair de um subshell, ele não será criado:

$ [ -e $HISTFILE ]; echo $?
1

$ (exit)

$ [ -e $HISTFILE ]; echo $?
1

Por que o arquivo de histórico não foi criado em um subshell?

    
por Steven Penny 23.04.2016 / 23:02

1 resposta

1

Se um bash shell for aberto, será passado o conteúdo do arquivo de histórico. Quando sai, anexa seu histórico ao arquivo de histórico.

Se você abrir outro bash shell (interativo) (na mesma janela de terminal), executar alguns comandos ou apenas exit , os comandos (ou apenas exit ) serão anexados ao arquivo de histórico.

Se, no entanto, você executar um sub-shell não interativo, o histórico será desativado e a variável de ambiente HISTFILE não será definida.

Você pode verificar isso executando (bash -c 'echo x$HISTFILE') ou apenas bash -c 'echo x$HISTFILE' . Isso somente ecoará x , provando que a variável HISTFILE não está definida no sub-shell. (Eu adicionei somente o x para ter alguma saída visível do comando echo).

(O motivo para bash -c e o único as cita para impedir a expansão da variável shell no shell pai. Se você executar (echo x$HISTFILE) , a expansão da variável shell passará o valor de HISTFILE para o sub-shell, que em seguida, echos, fazendo com que pareça que está definido no sub-shell).

Portanto, ao executar um sub-shell, o histórico é desativado e a variável HISTFILE não é definida. Quando a subchave sai, nada é acrescentado ao histórico. Isso é exatamente o que você está vendo.

Você pode forçar o sub-shell a gravar seu histórico no arquivo de histórico:

$ history -w  # write current history
$ wc -l $HISTFILE  # count lines in history file
32 /home/anyuser/.bash_history

$ bash -c 'export HISTFILE=~/.bash_history'
$ wc -l $HISTFILE
32 /home/anyuser/.bash_history

$ bash -c 'export HISTFILE=~/.bash_history;history -w'
$ wc -l $HISTFILE
0 /home/anyuser/.bash_history 

O último comando sub-shell (aquele com history -w ) sobrescreve o arquivo histórico existente com o histórico do sub-shell, que está vazio porque o histórico está desativado em um sub-shell não interativo.

    
por 24.04.2016 / 10:44