Qu'est-ce qui fait qu'un copier / coller dans le terminal exécute parfois la commande?

24

Lorsque vous collez une commande dans le terminal, il exécutera parfois automatiquement la commande (comme si la touche "Entrée" était enfoncée), parfois non.

J'utilise Linux depuis des lustres, j'ai collé des milliers de commandes dans diverses consoles sur de nombreuses distributions, et je ne suis toujours pas en mesure de dire si la commande que je vais coller sera exécutée automatiquement ou non.

Qu'est-ce qui déclenche ce comportement?

kursus
la source
5
Si vous voulez éviter de vous inquiéter à ce sujet, tapez { (w / espace) avant de coller, puis terminez par }. Cela n'a aucun effet sur le fonctionnement des commandes collées, mais empêche le shell de l'exécuter jusqu'à ce que vous fermiez le bloc. Décrit ici [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Réponses:

37

C'est le caractère de retour dans le texte que vous copiez qui déclenche l'exécution automatique.

Prenons un autre exemple, copions ces lignes d'un coup et collez-les dans votre terminal:

echo "Hello";
echo "World";

Si vous regardez dans votre terminal, vous ne verrez pas ceci:

$ echo "Hello";
echo "World";

Vous verrez ceci (il peut aussi y avoir une ligne disant World):

$ echo "Hello";
Hello
$ echo "World";

Au lieu d'attendre que toutes les entrées soient collées, la première ligne s'exécute (et pour la même raison, la deuxième ligne peut également le faire). C'est parce qu'il y a un RETURNcaractère entre les deux lignes.

Lorsque vous appuyez sur la ENTERtouche de votre clavier, tout ce que vous faites est d'envoyer le caractère avec la valeur ASCII de 13. Ce caractère est immédiatement détecté par votre terminal et sait qu'il dispose d'instructions spéciales pour exécuter ce que vous avez tapé jusqu'à présent.

Lorsqu'il est stocké sur votre ordinateur ou imprimé sur votre écran, le RETURNcaractère est comme n'importe quelle autre lettre de l'alphabet, du chiffre ou du symbole. Ce caractère peut être supprimé avec un retour arrière, ou copié dans le presse-papiers comme n'importe quel autre caractère normal.

La seule différence est que lorsque votre navigateur voit le caractère, il sait qu'au lieu d' imprimer un caractère visible, il doit le traiter différemment et dispose d'instructions spéciales pour déplacer l'ensemble de texte suivant vers la ligne suivante. Le RETURNcaractère et le SPACEcaractère (ascii 32), ainsi que quelques autres caractères rarement utilisés, sont appelés "caractères non imprimables" pour cette raison.

Parfois, lorsque vous copiez du texte à partir d'un site Web, il est difficile de copier uniquement le texte et non le retour à la fin (et cela est souvent rendu plus difficile par le style de la page).


Expérimentez le temps!

Ci-dessous, vous trouverez deux commandes qui illustreront le problème et sur lesquelles vous pourrez vous "entraîner". Commencez votre curseur juste avant echoet faites glisser jusqu'à ce que la surbrillance soit juste avant la flèche:

echo "Wait for my signal...";<- End cursor here right after the semicolon

Et maintenant, essayez la deuxième commande. Commencez votre curseur juste avant echoet faites glisser vers le bas jusqu'à ce que le curseur se trouve sur la deuxième ligne, mais juste devant la <-flèche. Copiez-le, puis collez-le dans votre terminal:

echo 'Go go go!';
<- End cursor here right before the arrow

En fonction de votre navigateur, il peut même ne pas être visible que le texte que vous avez sélectionné soit sur deux lignes. Mais lorsque vous le collez dans le terminal, vous constaterez qu'il exécute la ligne, car il a trouvé un RETURNcaractère dans le texte copié.

IQAndreas
la source
5
Pour réduire la complexité, j'ai complètement ignoré mentionner que Windows utilise deux clés différentes pour les retours. Sachez simplement que c'est un malheur et une lutte quotidiens auxquels nous devons faire face.
IQAndreas du
l'espace est un caractère d'impression
mikeserv
1
Peut-être. Cependant, lorsque je teste une pâte de Firefox dans un shell (avec stty réglé sur "raw"), les lignes se terminent par des sauts de ligne - pas un retour chariot.
Thomas Dickey
1
Vous n'avez pas besoin de passer à la ligne suivante, si vous sélectionnez et passez au-delà du point-virgule d'une quantité suffisante (2-3 caractères), il sélectionnera la ligne entière, ce qui signifie que vous vous êtes attrapé une nouvelle ligne.
@ThomasDickey Êtes-vous sur Windows ou sur un système basé sur Unix?
IQAndreas
10

Lorsque vous sélectionnez du texte, s'il vous arrive d'inclure la nouvelle ligne (invisible) à la fin d'une ligne, elle sera dans le texte collé. Cela est cohérent dans tous les émulateurs de terminaux que je connais. La nouvelle ligne fait ce que vous appelez "valider".

Sur certains systèmes (tels que ceux utilisant des terminaux synchrones comme l'IBM 3270), la Enterclé "validerait" l'écran en copiant toutes les modifications sur l'hôte.

Thomas Dickey
la source
2

Qu'est-ce qui déclenche ce comportement?

Le caractère de nouvelle ligne.

PSkocik
la source