script bash para excluir as últimas 10 linhas do histroy

script bash para excluir as últimas 10 linhas do histroy

quero fazer um script bash para excluir as últimas 10 linhas do histórico que foi o que fiz, mas ainda recebo um erro

#!/bin/bash
i= history | wc -1
j= $i-10
for x in {$i..$j}
do
  history -d $x
done

Não consigo descobrir o que está errado, alguma ideia?

Responder1

Existem vários erros.

eu= história | wc -1

Você tem espaços aqui, então você precisa colocar isso em "" para evitar um erro e, além disso, adicionou um espaço desnecessário após o sinal de igual. No entanto, tudo o que você fez foi criar uma variável contendo "history | wc -1". Em primeiro lugar, não existe "wc -1". Acho que você quis dizer "wc -l", que conta as linhas. Em segundo lugar, acho que você queria realmente executar este comando.

Você poderia usar:

eu=$(histórico | wc -l)

No entanto, sempre será 0 como resultado, porque você está em um subshell.

j=$i-10

Você adicionou um espaço após o sinal de igual. Você poderia usar "j=$i-10", mas isso não vai fazer nenhuma matemática.

Tente algo como:

j=$(echo "${i}-10" | bc -l)

Você provavelmente vai querer escrever uma instrução if para lidar com cenários onde i é 10 ou menos.

Tente algo como:

if [[ "$i" -lt "11" ]]; então j="1"; fi
para x em {$i..$j}

Você não pode usar variáveis ​​aqui. O resultado será #..# em vez de uma lista de números. Você poderia contornar esse problema criando uma instrução de uma linha para do done que é ecoada em uma variável e então usar eval para realmente executá-la. Desta forma, $i e $j já terão sido substituídos pelos números reais quando o comando for executado.

Em última análiseno entanto,toda a abordagem é inútil, porque quando você executa o comando history no shell script você obterá zero como resultado da contagem, porque você está em um subshell e os subshells não relatam seu histórico. Para entender o que quero dizer, execute vários comandos e, em seguida, execute este script:

#!/bin/bash
história | wc-l

Como você pode ver, o resultado é 0. Por quê? Porque é o histórico do subshell, e o subshell não relata o histórico. Mesmo se você adicionar outros comandos ao script antes do comando de histórico, o resultado será 0.

Recomeçar. Procure editar o arquivo de histórico diretamentecomo @kos sugeriu. Lembre-se de que os comandos do shell atual não são gravados no arquivo até que o shell seja encerrado.

Boa sorte.

informação relacionada