Entendo que o erro a seguir deve ser !
usado para expansão do histórico:
$ echo "Hello!Tim"
bash: !Tim: event not found
No entanto, se eu colocar o comando em um script e executá-lo, não há problema:
$ cat myscript
echo "Hello!Tim"
$ bash myscript
Hello!Tim
Por que é que? O manual do bash menciona o motivo?
shopt
modificador para que ele funcione em seu script. Eu sei que essa não é realmente a resposta que você está procurando.!!
ou!-2
(números históricos negativos / relativos) ou similares. Principalmente, eles seriam resolvidos melhor de outras maneiras, mas ainda é uma boa pergunta sobre como o shell funciona (e quando você faz / não precisa escapar dos exclams!).Respostas:
Sim, a expansão do histórico é ativada por padrão apenas para shells interativos.
Para habilitá-lo para um script de shell, escreva:
Para desativá-lo em um shell interativo, escreva:
Para determinar se a expansão do histórico está ou não ativada no momento, use alguma forma do seguinte código:
Ao começar a dar uma aula de shell, procurei o manual extensivamente para tentar estabelecer o que realmente é um "shell interativo". É uma questão de redemoinho, então deixe-me lhe poupar alguns problemas:
O shell tem muitas opções. Algumas dessas opções são inicializadas de maneiras diferentes quando o shell possui um terminal de controle (ou quando iniciado com
-i
blá blá, o que seja, veja abaixo).TODAS as opções do shell podem ser alteradas individualmente.
Um "shell 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 responder; fica ridículo. É precisamente a mesma pergunta filosófica que a nave de Teseu .
Se você iniciar um shell interativo, mas desativar a expansão do histórico, use o
--noediting
sinalizador, defina--norc
, desativeexpand_aliases
etc., etc., em que sentido o shell é interativo? Ou quando não se torna mais interativo? Você não pode responder a estas 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.
Conclusão: o shell se comporta de maneira diferente quando é iniciado "interativamente" em comparação com quando é iniciado "não interativamente". Tentar definir com precisão esses termos após a inicialização é uma tolice. Basta olhar para cada opção individual do shell para entender seu comportamento.
Eu tinha esquecido que, além de minha própria pesquisa, publiquei extensivamente sobre isso neste mesmo site.
fonte
set -H
. Provavelmente, você deduz que "a expansão do histórico é ativada por padrão apenas para shells interativos".case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac
set -H
. Essa é a opção histexpand.set -o history
, depois de verificar comset -o
o script que ele estava desativado.