Suponha que eu escrevi um script bash com o nome delay.sh
. O que você acha que ele faz?#!/bin/bash
sleep 30
echo "Time's up!"
Parece que aguarda 30 segundos e exibe uma mensagem na tela. Não há truques aqui - ele faz exatamente isso. Há um comando perigoso no meio, mas é comentado e não é executado.Imagine que eu execute esse script novamente, mas agora não quero esperar 30 segundos - isso é muito longo. Abro o segundo console, mudo sleep 30
para sleep 3
e salve o arquivo. O que você acha que vai acontecer agora?Bem, depois de 30 segundos, o script excluirá todos os meus arquivos.Isso ocorre porque o bash lê o conteúdo do script em fragmentos à medida que avança, rastreando o deslocamento em bytes. Quando eu remover um caractere da string sleep
, o deslocamento para o início do próximo pontos de comando para r
, em #rm
vez disso #
. Do ponto de vista do intérprete, ele #
é deslocado para a linha anterior e, portanto, executa o comando a partir de rm
.Isso pode ser confirmado observando as chamadas do sistema bash no Linux. Aqui está a questão strace bash delay.sh
, com comentários e abreviação.
openat(AT_FDCWD, "delay.sh", O_RDONLY) = 3
read(3, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 80) = 64
lseek(3, 0, SEEK_SET) = 0
dup2(3, 255) = 255
read(255, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 64) = 64
lseek(255, -43, SEEK_CUR) = 21
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2072
read(255, "echo \"Don't execute me\"\necho \"Ti"..., 64) = 42
write(1, "Don't execute me\n", 17) = 17
write(1, "Time's up!\n", 11) = 11
read(255, "", 64) = 0
Portanto, tenha cuidado ao começar a editar o script bash atualmente em execução. Ele pode executar o comando errado ou fazer algo muito inesperado.