Por que esse script não exclui parte do meu histórico de comandos que está funcionando no meu computador?

4

O script pode ser encontrado aqui: link

Por conveniência, aqui está:

for x in 'seq  '
do
  history -d 
done

Eu coloquei isso no meu diretório de inclusão (um que eu adicionei ao PATH) onde eu corro muitos outros scripts que escrevi e trabalho muito bem.

Isso não produz o resultado desejado de excluir linhas do meu histórico, na verdade, não faz nada.

Alguma idéia de por que o comando de histórico não funciona? Eu estou querendo saber se tem algo a ver com os diretórios.

Informações adicionais:

Brinquei com o código e tentei diferentes variações. Se eu colocar um echo na frente do comando history e executá-lo, recebo a seguinte saída:

cgravel@scspc578:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
cgravel@scspc578:~$ 

Então, para mim, parece que deveria funcionar perfeitamente. Eu não consigo descobrir o porquê. Este script está sendo executado em / $ HOME / Scripts / e foi incluído no PATH. Eu também tentei executá-lo com o sudo e nada muda.

    
por Klik 12.01.2015 / 19:21

2 respostas

10

Em uma frase: não funciona porque você não está chamando corretamente.

Primeiro, como seu script não começa com #!/bin/bash , ele não é realmente um script bash. Qual shell é executado depende de como você o invoca. Quando você invoca-lo a partir da linha de comando bash, bash garfos uma nova instância de si mesmo (isso tem que acontecer com execute qualquer comando externo), e é essa nova instância que executa o script. Portanto, o script é executado com as mesmas configurações (incluindo o histórico até agora) que o shell pai. Ele é executado com diferentes opções ; em particular, o rastreamento de histórico está desativado para os comandos no script (o que mais lhe convém, já que, caso contrário, ele seria adicionado ao histórico que você deseja modificar).

Se a instância do bash que está executando o script tem a variável HISTFILE set depende se foi exportado no pai (o que é um pouco estranho). Se não for exportado e, portanto, definido no filho, o script filho não salvará o histórico modificado quando terminar.

Se HISTFILE for exportado, o script filho modificará seu arquivo de histórico. No entanto, a menos que você tenha configurado seu shell interativo para recarrega o histórico após cada comando , o histórico modificado só será escolhido por instâncias recém-iniciadas do bash.

Se você deseja executar um fragmento de shell que afeta a instância atual do shell, você deve executar esse shell na instância atual do shell, em vez de executá-lo como um subprocesso . Você teria um problema semelhante se quisesse fazer outras coisas que afetassem o próprio processo de shell, como alterar diretórios, definir variáveis, etc. Use o . (“ponto”) ou source embutido para executar um script no processo de shell atual.

. idelhistory 300 365

Como alternativa, você pode definir isso como uma função em .bashrc .

    
por Gilles 13.01.2015 / 00:50
2

Edit: Parece que ainda parece haver alguns problemas em certas máquinas que executam este script. Outra (e talvez a melhor) maneira de fazer isso não seria tentar usar um shell embutido, mas modificando diretamente o $ HISTFILE

#!/bin/bash
HISTFILE=~/.bash_history # Or just let the shell decide
for x in 'seq  '
do
  sed "\'d\'" $HISTFILE
done

Resposta original:

O problema parece ser a execução do script bash de forma não interativa ...

Esta discussão sobre Unix e Linux parecem cobrir um método de solução alternativa para fazer seu script funcionar:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
for x in 'seq  '
do
  history -d 
done
    
por joshumax 12.01.2015 / 21:55