Parce que je passe la majeure partie de ma vie dans le shell IPython, j'ai la mauvaise habitude d'ajouter des commandes de terminal avec des points d'exclamation. Habituellement, cela conduit simplement à une erreur, mais parfois, il se produit quelque chose de mauvais. Puis-je désactiver efficacement le !
fonctionnalité dans mon terminal? Et cela risquerait-il d'interférer avec des scripts?
Dans les shells interactifs, par défaut, !
est utilisé pour l'expansion de l'historique: le Shell recherchera une commande correspondant au texte suivant !
, et exécutez cela. Comme indiqué dans cette réponse à Impossible d'utiliser le point d'exclamation (!) Dans bash? les shells permettent de désactiver l'expansion de l'historique:
set +H
set -K
Si vous ne souhaitez jamais utiliser l'extension d'historique pilotée par des points d'exclamation, vous pouvez les ajouter aux scripts de démarrage de votre Shell.
Cela ne causera pas !
à ignorer, mais ils éviteront d'exécuter des commandes à partir de votre historique. !command
se plaindra que !command
n'existe pas.
Les scripts shell ne sont pas affectés par ces paramètres, ils obtiennent leurs propres shells avec une configuration non interactive (qui n'inclut pas l'expansion de l'historique par défaut).
Si vous n'utilisez jamais! depuis le terminal, vous pouvez l'affecter à une fonction que vous n'utilisez jamais non plus, comme (dans mon cas) effacer:
stty werase !
Ensuite, chaque fois que vous tapez! , il effacera simplement le mot précédent. Si vous ne le saisissez qu'au début d'une commande de terminal, cela n'aura tout simplement aucun effet.
Si vous avez besoin d'un point d'exclamation réel, vous pouvez toujours le saisir en le précédant avec CTRL-V (ou quel que soit votre caractère lnext
) pour le citer/l'échapper.
Si vous n'utilisez pas normalement la fonctionnalité lnext
, vous trouverez peut-être plus pratique de redéfinir lnext
pour être !
À la place; cela vous permettrait d'entrer un point d'exclamation en le saisissant deux fois (le premier citant le second).
stty lnext !
Une explication plus détaillée de la façon dont cela fonctionne:
La fonctionnalité lnext
est: "n'interprétez pas le caractère suivant comme quelque chose de spécial: acceptez simplement le caractère comme une entrée tel qu'il est". S'il s'agit d'un caractère spécial stty, n'appliquez pas cette fonctionnalité spéciale, mais utilisez simplement le caractère tel qu'il est. Cela inclut le caractère affecté à la fonction lnext
.
Le caractère lnext
par défaut est CTRL-V (mnémonique: "verbatim", comme dans: entrez le caractère suivant textuellement). Ici, nous réaffectons cette fonction au caractère !
À la place.
lnext
est choisi principalement parce que son effet est "aucun effet" dans la plupart des cas (par exemple, lorsque le caractère suivant tapé est un caractère normal). Lorsque vous tapez accidentellement !
Au début de la ligne, le caractère suivant est presque toujours un caractère normal, sans action spéciale, donc le citer/l'échapper (le traiter explicitement comme un caractère normal) ne fait pas de mal. Lorsque nous écrivons un a
après un !
, La signification passe de "écrire un a
" à une signification plus spécifique qui fait de même: "écrire un a
, et ignorez tout le reste, faites-le! "
Si nous voulons créer un caractère !
Réel, nous pouvons utiliser cette fonctionnalité lnext
pour le citer. Ainsi, en tapant !!
, Un seul !
Est entré.
Si vous utilisez le shell zsh
, vous pouvez ajouter à votre ~/.zshrc
:
zmodload zsh/zselect
bang() {
zle self-insert
if [[ $CONTEXT = start && $LBUFFER =~ '^!+$' ]]; then
local -a old_region_highlight=($region_highlight)
region_highlight+=("0 $CURSOR fg=red,bg=white,bold,standout")
zle -R 'Will you please stop?!'
zselect -t 100 -r 0 < /dev/tty
region_highlight=($old_region_highlight)
LBUFFER=
fi
}
zle -N bang
bindkey '!' bang
De sorte que lorsque vous entrez un ou plusieurs !
au début du tampon d'édition, il les surligne en rouge, vous donne un message et les supprime (après une seconde, ou plus tôt si vous tapez autre chose).