46 votes

Arrêter l'exécution automatique du terminal lors du collage d'une commande

Il s'agit d'une fonction légèrement gênante, car elle se produit parfois et parfois non, ce qui est très étrange.

Je colle une commande dans le terminal en vue de modifier ses arguments, et parfois il s'exécute à la seconde où je le colle. Parfois, ce n'est pas le cas.

Cela va de l'embarrassant (poster des commentaires absurdes sur un IRC) au dangereux.

Comment puis-je désactiver définitivement cette fonction ? Je ne veux jamais, jamais, jamais que le terminal s'exécute automatiquement lorsque je le colle.

35voto

Il n'y a pas d'exécution automatique. Vous copiez probablement aussi un saut de ligne (ou plus) après la commande.

Si vous collez une commande avec une pause, le Shell (ligne de commande) pense que vous avez appuyé sur le bouton de pause (Entrée, Retour) par vous-même.


Cette réponse ne fait qu'expliquer pourquoi l'OP obtient le comportement indésirable. Cependant, en une autre réponse, il y a une vraie solution au problème de l'OP.

20voto

borrascador Points 299

Un réel La solution consiste à ouvrir le mode d'édition avec ctrl-x ctrl-e puis collez en toute sécurité votre presse-papiers dans l'éditeur de votre choix (généralement emacs ou vim). Une fois que vous avez fini d'éditer la commande, enregistrez-la et quittez-la pour qu'elle s'exécute en ligne de commande. C'est une bonne habitude pour les commandes longues ou complexes, en particulier lorsque vous collez des hashs commit dans les commandes git, et cela peut vous aider à éviter des résultats effrayants à long terme.

L'éditeur peut être modifié en définissant les variables VISUAL et EDITOR (qui ont des significations différentes, voir aquí ).

13voto

Kal Points 231

Comme d'autres l'ont mentionné, le problème se produit lorsque le texte collé contient des caractères de nouvelle ligne. Sachant cela, votre question est plus ou moins la même que la suivante celui-ci sur Server Fault . Site différent, je vais donc répéter ma réponse ici

Ce que vous souhaitez, c'est ce que l'on appelle ' pâte entre crochets ', une fonctionnalité disponible dans certains shells.

En supposant que vous utilisiez une version récente du Shell de bash, vous pouvez l'activer pour la session en cours de la manière suivante :

bind 'set enable-bracketed-paste on'

Essayez maintenant en collant plusieurs lignes :

echo Hello world
echo Again, I say, hello!

Le Shell reconnaît que le texte a été collé (et non tapé) et attend votre confirmation. Si tout semble correct, appuyez sur la touche Entrée. Dans le cas contraire, appuyez sur Control-C pour annuler.

Si vous souhaitez activer le collage entre crochets pour chaque nouvelle session, ajoutez la commande à votre fichier .inputrc :

cd ~
echo "set enable-bracketed-paste" >> .inputrc

Une autre option consiste à passer de bash a zsh où la fonction de collage entre crochets est activée par défaut. Pour remplacer votre Shell actuel par un Shell zsh :

exec zsh

Avec zsh, le texte collé est mis en évidence, ce qui est agréable. Encore une fois, appuyez sur Entrée pour exécuter la/les commande(s) ou sur Contrôle-C pour annuler.

Si vous aimez zsh et souhaitez en faire le Shell par défaut :

chsh -s /bin/zsh

7voto

Lance Points 87

Avant de coller, tapez un # puis collez votre ligne. Elle ne s'exécutera pas et vous pourrez retirer le # et appuyer sur Entrée lorsque les modifications auront été effectuées.

0voto

Nam G VU Points 1938

J'utilise cet alias pour coller et faire en sorte que ma commande ne soit pas exécutée.

alias nonewlinepaste='history -s `xsel -b`; sleep 1; xdotool key Up 1>/dev/null'  # xsel ref. https://unix.stackexchange.com/a/96398/17671  # xdotool ref. https://unix.stackexchange.com/questions/267704/command-to-simulate-keyboard-input#comment1038650_267705

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X