Je comprends que l'erreur suivante est due à une !
utilisation pour l'extension de l'historique:
$ echo "Hello!Tim"
bash: !Tim: event not found
Cependant, si je mets la commande dans un script et exécute le script, il n'y a pas de problème:
$ cat myscript
echo "Hello!Tim"
$ bash myscript
Hello!Tim
Pourquoi donc? Le manuel bash mentionne-t-il la raison?
shopt
modificateur pour le faire fonctionner dans votre script. Je sais que ce n'est pas vraiment la réponse que vous cherchez.!!
ou!-2
(nombres historiques négatifs / relatifs) ou similaires. Généralement, ils seraient mieux résolus d'autres manières, mais c'est toujours une bonne question sur le fonctionnement du shell (et quand vous avez / n'avez pas besoin d'échapper à vos exclams!).Réponses:
Oui, l'expansion de l'historique est activée par défaut uniquement pour les shells interactifs.
Pour l'activer pour un script shell, écrivez:
Pour le désactiver dans un shell interactif, écrivez:
Pour déterminer si l'expansion de l'historique est actuellement activée ou non, utilisez une forme du code suivant:
En commençant à enseigner une classe shell, j'ai fouillé le manuel de manière approfondie pour essayer de déterminer ce qu'est réellement un "shell interactif". C'est une question tourbillon, alors laissez-moi vous éviter quelques ennuis:
Le shell a de nombreuses options. Certaines de ces options sont initialisées de différentes manières lorsque le shell a un terminal de contrôle (ou lorsqu'il est démarré avec
-i
, bla bla, peu importe, voir ci-dessous).TOUTES les options du shell peuvent être modifiées individuellement.
Un «shell interactif» est un terme trompeur lorsque vous essayez de le définir avec précision. C'est vraiment juste une collection de paramètres d'options.
Il est impossible de répondre à la question de savoir quels paramètres rendent un shell interactif ou non; ça devient ridicule. C'est précisément la même question philosophique que le Navire de Thésée .
Si vous démarrez un shell interactif, mais désactivez ensuite l'expansion de l'historique, utilisez l'
--noediting
indicateur, définissez--norc
, désactivezexpand_aliases
, etc., etc., dans quel sens le shell est-il interactif? Ou, quand ne devient-il plus interactif? Vous ne pouvez pas répondre à ces questions.La vérité est que "interactif" n'est qu'une étiquette pratique pour une collection de diverses options de shell. De même «non interactif». Même chose; juste une collection de comportements qui peuvent chacun être modifiés individuellement.
Conclusion: le shell se comporte différemment quand il est démarré "interactivement" par rapport à quand il est démarré "non interactivement". Essayer de définir précisément ces termes après le démarrage est idiot. Il suffit de regarder chaque option individuelle du shell pour comprendre son comportement.
J'avais oublié qu'en plus de mes propres recherches, j'en ai beaucoup parlé sur ce site.
la source
set -H
. C'est probablement votre conclusion que "l'expansion de l'historique est activée par défaut uniquement pour les shells interactifs".case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac
set -H
. C'EST l'option histexpand.set -o history
, après avoir vérifié avecset -o
le script qu'il était désactivé.