Désactiver le comportement par défaut de copier-coller dans Bash


9

Lorsque je colle dans ma session de terminal, le shell exécute immédiatement la commande sans que j'appuie sur la touche Entrée.

Je ne sais vraiment pas comment désactiver ce comportement.

J'utilise le terminal préinstallé sur MacOS Yosemite.


9
Il ne fait cela, bien sûr, que si le tampon de collage contient une nouvelle ligne. Cela n'a (presque) rien à voir avec bash. (Il ne concerne bash que si et dans la mesure où il utilise la bibliothèque readline.)
Peter - Reinstate Monica

... et pourtant bash(avec l'aide de readline) a une solution.
alexis

Réponses:


16

Avec bash4.4 ou plus récent et dans les terminaux qui prennent en charge le collage entre parenthèses xterm, vous pouvez faire:

bind 'set enable-bracketed-paste'

(ou ajouter set enable-bracketed-pasteà votre ~/.inputrc)

Cela entraînera l'insertion du tampon de copier-coller à l'invite au lieu que les caractères qu'il contient soient interprétés comme s'ils étaient tapés (vous pouvez toujours avoir des problèmes si ce tampon contient des caractères comme ^C, ^Zet votre émulateur de terminal ne les filtre pas) .

zsh fait cela par défaut depuis la version 5.1.

Pour d'autres coques ou terminaux, voir aussi: Comment puis-je me protéger contre ce type d'abus du presse-papiers?


Je vais y jeter un œil
Opaldes

les moyens de stand ne semblent pas fonctionner
Opaldes

@Opaldes, qu'avez-vous essayé? Avec quelle version de quel shell et sur quels terminaux? Je crois que OS / X est également livré avec xterm, vous pouvez essayer cela à la place. Avez-vous essayé le perlscript à la question liée?
Stéphane Chazelas

1
@Opaldes, selon Collage de code dans la fenêtre du terminal dans vim sur Mac OS X OS / X Terminal prend en charge la pâte entre crochets depuis OS / X Lion. Il semblerait donc que tout ce dont vous avez besoin soit une version suffisamment récente de zsh ou bash. Avec les anciennes versions de zsh, cela peut également être réalisé via la configuration.
Stéphane Chazelas

1
Nous pouvons remercier Daniel Colascione d'avoir ajouté cette fonctionnalité utile à Bash / Readline: gnu-bash.2382.n7.nabble.com/…
Anthony Geoghegan

6

Cela se produit lorsque vous collez un caractère "saut de ligne". Par exemple, si vous collez plusieurs lignes ou si vous copiez de manière inconnue un retour chariot à la fin de la ligne. AFAIK, il n'y a aucun moyen de désactiver réellement ce comportement, mais il existe des moyens de l'atténuer.

Le moyen le plus simple consiste à copier une seule ligne à la fois et à rater le dernier caractère, en l'ajoutant ensuite manuellement.

Ou, comme le souligne le_velour_fog ci-dessous, vous pouvez également le coller dans un éditeur qui affiche des caractères non imprimés et resélectionner sans la nouvelle ligne.

Il existe une ou deux solutions de contournement pour les distributions GNU / Linux mais aucune idée si le concept pourrait être porté sur MacOS. Quoi qu'il en soit, jetez un œil ici et voyez s'il existe un fichier similaire dans Mac que vous pouvez modifier. Malheureusement, j'en doute.


Je viens de le coller dans un éditeur qui affiche des caractères non imprimés, puis de resélectionner sans la nouvelle ligne
the_velour_fog

Bonne suggestion, modifiée pour inclure.
I_GNU_it_all_along

bon à savoir qui explique que cela n'arrive pas tout le temps. J'ai voté contre votre réponse, mais c'est plus une solution de contournement pour moi.
Opaldes

C'est pénible mais peut être utile lors de la copie d'une série de commandes.
I_GNU_it_all_along

Ma "solution" est également une sorte de solution de contournement, mais c'est plus rapide que de sélectionner séparément, IMO.
Peter Cordes

5

Avant de coller, tapez un guillemet simple , puis collez. contrôle-c et flèche haut pour le modifier comme une seule ligne géante.

les guillemets doubles fonctionnent également, dans le cas où le texte contient des guillemets simples mais pas doubles. Ce n'est pas grave s'il contient $ou d'autres choses qui se développent à l'intérieur de guillemets doubles, car vous n'exécutez pas réellement la ligne géante citée comme une seule commande.


Vous ne pouvez pas réellement éditer le tout ici, car les nouvelles lignes lancent une invite de continuation (pas la terminologie officielle) au lieu de faire une grande longue ligne.

étant donné ces 4 lignes:

echo
ls
foo
bar

coller comme je le suggère entraînera ceci sur votre écran:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

Vous pouvez ensuite appuyer sur Ctrl-C et sur la flèche vers le haut. (Ctrl-C détruit tout sur la même ligne que le curseur, donc appuyez d'abord sur Retour s'il y a du texte utile.)

Une alternative consiste à fermer le devis et à appuyer sur Retour, puis sur la flèche vers le haut.

Quoi qu'il en soit, après la flèche vers le haut

$ 'echo
ls
foo
bar

control-a et supprimez l'interligne '. Utilisez control-left et control-right pour vous déplacer rapidement dans le bloc de collage (par mots). Ou si la configuration de votre terminal ne prend pas en charge les touches fléchées de contrôle, alt-b et alt-f.


Les sauts de ligne littéraux séparent en fait les commandes, et ces 4 lignes entreront dans votre historique de commandes séparément . Vous voudrez peut-être les changer en ;ou &&. (Je ne connais pas d'astuce pour cela, utilisez simplement la répétition de touche pour le mot avant ou arrière pour y arriver rapidement et le faire manuellement.)


2

Cela se produit car votre collage se termine par une nouvelle ligne et les émulateurs de terminal alimentent essentiellement la pâte pour bash caractère par caractère. Dans ce processus, bash ne connaît pas vraiment la dactylographie humaine d'une machine.

En général, je fais juste attention lorsque je fais du copier-coller pour qu'il n'inclue pas de nouvelle ligne, mais il y a une astuce que vous pouvez essayer: avant de coller, dans bash, tapez C-x C-e. Il devrait se lancer $EDITORavec un fichier vide. Tout ce que vous enregistrez dans ce fichier et quittez, bash s'exécute. Vous pouvez donc maintenant coller votre commande dans l'éditeur, éventuellement manipuler davantage les choses, puis les exécuter toutes en une seule fois.


-1

Je ne suis PAS lié à l'entreprise, je suis un client très satisfait. Essayez ce programme de terminal: http://www.emtec.com/zoc/index.html . Il existe également une version Mac.

Si j'enfreins cette réponse à une règle SE, veuillez m'en informer et supprimer la réponse.

Éditer:

Lorsque j'ai bien compris les autres réponses, ce problème peut être dû au programme du terminal. Le programme terminal ZOC est un logiciel professionnel parfaitement conçu pour le travail. Il colle le texte que vous avez sélectionné sans aucun caractère supplémentaire. Vous pouvez enregistrer vos sessions dans un fichier texte séparé. Et bien plus

Mise à jour:

Le programme terminal a une option Paste without final 'newline'. Cela peut être utile.


3
Veuillez au moins dire comment cela répond à la question
Stéphane Chazelas

Si vous collez une chaîne contenant des caractères de nouvelle ligne ou de retour chariot à l'invite d'un shell exécuté dans ce terminal, que se passe-t-il? S'il ne provoque pas l'exécution immédiate des commandes par le shell (comme demandé ici), comment le fait-il? Supprime-t-il ces caractères de la sélection? Insère-t-il un caractère ^ V avant de l' échapper pour bash?
Stéphane Chazelas

2
En tant que tel, il ressemble plus à du spam (même si je suis sûr que ce n'était pas votre intention de spammer ce site). Il ne répond pas à la question et n'est qu'une publicité pour un produit commercial connexe.
Stéphane Chazelas

2
@AlBundy, découvrez si votre client terminal préféré résout ce problème en essayant les exploits discutés dans security.stackexchange.com/q/39118 (mentionné dans la réponse de Stéphane) et les liens que vous y trouverez. S'il vous protège, vous avez de bonnes raisons de le recommander (fournissez les détails de vos tests dans votre réponse).
alexis

En général , le problème est que ce que vous avez sélectionné fait inclure une nouvelle ligne. En quoi «coller le texte que vous avez sélectionné» est-il différent du comportement normal de tout autre émulateur de terminal?
Peter Cordes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.