A expansão de histórico está desativada em scripts?

6

Entendo que o seguinte erro se deve a ! usado para a expansão do histórico:

$ echo "Hello!Tim"
bash: !Tim: event not found

No entanto, se eu colocar o comando em um script e executar o script, não há problema:

$ cat myscript
echo "Hello!Tim"
$ bash myscript 
Hello!Tim

Por que isso? O manual do bash menciona o motivo?

    
por Tim 09.08.2017 / 03:57

1 resposta

10

Sim, a expansão do histórico é ativada por padrão apenas para shells interativos.

Para habilitá-lo para um script de shell, escreva:

set -H

Para desativá-lo em um shell interativo, escreva:

set +H

Para determinar se a expansão do histórico está ativada ou não, use alguma forma do código a seguir:

case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac

Ao começar a ensinar uma classe de shell, eu vasculhei o manual extensivamente para tentar estabelecer o que um "shell interativo" realmente é. É uma questão de hidromassagem, então deixe-me poupar alguns problemas:

O shell tem MUITAS opções. Algumas dessas opções são inicializadas de maneiras diferentes quando o shell tem um terminal de controle (ou quando iniciado com -i , blah blah, o que for, veja abaixo).

TODAS as opções do shell podem ser alteradas individualmente.

Um "escudo interativo" é um termo enganoso quando você tenta defini-lo com precisão. É realmente apenas uma coleção de configurações de opções.

A pergunta sobre quais configurações tornam um shell interativo ou não é impossível de responder; fica ridículo. É precisamente a mesma questão filosófica que a Nave de Teseu .

Se você iniciar um shell interativo, mas depois desabilitar a expansão do histórico, use o --noediting flag, defina --norc , desative expand_aliases , etc., etc., então em que sentido o shell é interativo? Ou, quando é que não se torna mais interativo? Você não pode responder a essas perguntas.

A verdade é que "interativo" é apenas um rótulo conveniente para uma coleção de várias opções de shell. Da mesma forma, "não interativo". Mesma coisa; apenas uma coleção de comportamentos que podem ser alterados individualmente.

Linha de fundo: o shell se comporta de maneira diferente quando é iniciado "interativamente" versus quando é iniciado "não interativamente". Tentar definir com precisão esses termos após a inicialização é tolo. Basta olhar para cada opção individual do shell para entender seu comportamento.

Eu tinha esquecido que além da minha própria pesquisa, eu postei sobre isso extensivamente neste mesmo site.

por 09.08.2017 / 04:51