! x não encontrado - script bash

3

Eu fiz um script bash simples para executar vários comandos no seu histórico, mas não está funcionando.

read -p "control + c to cancel"                                            
for i in $(seq  )                                                     
do                                                                         
  !${i}                                                                    
done

Eu corro como runrange 5 10 , e isso me dá !5: command not found . Se eu executar !5 , tudo funciona bem! Como posso consertar isso?

    
por lol 28.03.2017 / 17:20

2 respostas

2

O Bash realiza a expansão do histórico como a primeira coisa depois de ler uma linha de entrada, assim acontece antes de expandir as variáveis. O !$ em sua expansão !${i} é usado para se referir ao último argumento do comando anterior como uma sintaxe de caso especial.

Se você quiser ler (ou executar) os comandos salvos no histórico, você pode usar history -p ou fc .

Além disso, observe que você não pode acessar o histórico de um shell interativo a partir de um script externo, e há maneiras mais simples de repetir comandos dentro de um script.

    
por ilkkachu 28.03.2017 / 22:08
0

O script está sendo executado em uma sessão não interativa (e, claro, sem login) de bash ; em qualquer sessão de shell não interativa, a expansão do histórico é desativada por padrão.

Você precisa adicionar no topo do seu script (depois do shebang):

  • set -o history para ativar o histórico
  • set -o histexpand (ou set -H ) para ativar a substituição do histórico de estilo !

Lembre-se do histórico da sessão não interativa por padrão, será mantido na memória e liberado uma vez que a sessão termine, portanto, mesmo acima de duas opções não resolveria seu problema real, o problema real é qual comando você digitou até agora e o que você espera obter em qualquer sessão não interativa?

Para obter a ideia, adicione history antes do loop for .

    
por heemayl 28.03.2017 / 17:47