Terminal - copier depuis CLI sans utiliser de souris

20

Lors du lancement de commandes dans CLI, je veux copier la commande que je viens de tirer ou tout ce que j'ai écrit dans le terminal et la coller ailleurs sans utiliser de souris.

Comme dans l'image suivante, je veux copier la commande de mise à jour (complètement ou partiellement) sans utiliser la souris et la coller quelque part.

copier depuis CLI sans utiliser la souris

Prayagupd
la source
1
Vous utilisez gnome sans souris?
ott--

Réponses:

11

Vous pouvez utiliser au screen(1) sein de votre émulateur de terminal de choix ( xterm, gnome-terminal...).

La fonctionnalité dont vous avez besoin est intégrée screen. Vous devez vous familiariser avec son fonctionnement:

  • par défaut, la liaison de touches "commande" est Ctrl+ A, vous composez les commandes en émettant la séquence "commande" plus l'action spécifique.
  • la commande "copier" est: AltGr+[
  • la commande "coller" est AltGr+]

Vous pouvez "copier" la commande et "coller" dans un autre terminal.

screen est amusant et une fois que vous commencez à l'utiliser, vous vous demanderez comment il est possible que vous ne l'utilisiez pas du tout.

dawud
la source
Il n'y avait pas de screencommande, donc je l'ai installé dans gnome-terminal et j'ai commencé screendans un terminal. Mais je n'ai pas pu commencer par la suite. De plus, je n'ai pas compris ce que vous entendez par écran intégré.
priagupd
1
Lisez man screen. En outre, j'ai écrit intégré à l' écran », ce qui signifie la copie / coller fonctionnalité est présent dans screen par le design .
dawud
Vous devez utiliser la spacetouche pour sélectionner la zone souhaitée. Vous devez utiliser Ypour copier toute la ligne ou la zone souhaitée. L'écran est viadapté aux mouvements.
FelikZ
quelle est la AltGrclé? J'aiAlt
alhelal
1
L' screenoutil ne fonctionne pas a expliqué ici. Et cela ne semble pas apporter de réponse à la question.
Luís de Sousa
7

En plus des réponses déjà fournies, vous pouvez envisager de passer à un émulateur de terminal plus flexible.

Si vous étiez prêt à changer les terminaux en rxvt-unicode , vous pourriez utiliser un outil comme urxvt-perls : une collection de scripts qui fournissent les fonctionnalités de clavier suivantes dans cet émulateur de terminal:

  • sélectionner, copier et coller du texte
  • recherche avant et arrière
  • mettez en surbrillance et ouvrez les URL dans votre navigateur préféré

Vous installez simplement le package, puis ajoutez quelques lignes à votre ~/.Xresources, et vous pouvez ensuite débrancher le rongeur pour de bon.

jasonwryan
la source
4

Vous pouvez le faire en utilisant un programme comme xclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

Une fois que vous l'avez installé, vous pouvez l'utiliser pour vous connecter à votre presse-papiers X. Malheureusement, cela ne fonctionnera pas dans votre mysqlenvironnement (il a son propre tampon pour les lignes copiées) mais il le sera si vous voulez exécuter une commande «normale». Par exemple :

$ This is a long command line

Tapez CtrlApour aller au début de la ligne, mettez la commande entre guillemets puis faites-la écho:

$ echo -e "This is a long command line" |xclip 

Vous avez maintenant "Ceci est une longue ligne de commande" dans votre presse-papiers de clic du milieu.

Si vous souhaitez coller sans utiliser de souris, cela dépendra de l'endroit où vous collez. Vous pouvez coller dans un autre terminal en exécutant:

$ xclip -o

Vous pouvez coller dans le même terminal, simplement en tuant (coupant) la commande avec CtrlKpuis en collant avec CtrlY.

Vous pouvez également enregistrer des commandes sur plusieurs terminaux à l'aide de l'historique de bash. Ajoutez cette ligne à votre ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDest une variable bash spéciale. S'il est défini, la valeur est exécutée en tant que commande avant d'émettre une nouvelle invite. history -aécrira l'historique de la session en cours dans le fichier historique et history -rrechargera ce fichier. Cela signifie que chaque commande que vous exécutez sera immédiatement écrite dans le fichier historique.

Maintenant, lorsque vous exécutez une longue ligne de commande, vous pouvez basculer vers un autre terminal et appuyer sur Retour (juste pour exécuter $PROMT_COMMAND, ou ouvrir une nouvelle fenêtre de terminal) et il sera accessible à l'historique de ce terminal. Si vous frappez maintenant, Upvous pouvez l'exécuter sur le nouveau terminal.

terdon
la source
C'est bon, mais je dois encore utiliser la souris?
priagupd
@PrayagUpd ah, oui, cela copiera dans le tampon de clic du milieu. Voir la réponse mise à jour pour une autre façon.
terdon
Je pense que ce $ xclip -on'est pas ce que je veux parce qu'il imprime juste ce que je xcliped. Mais +1 pour Ctrl+Asuivi Ctrl+Ket Ctrl+Ypour couper et coller au moins dans le même terminal.
priagupd
@PrayagUpd, le problème est qu'il y a plusieurs tampons de presse-papiers en jeu et la solution dépendra de ce que vous voulez faire exactement. Pourriez-vous mettre à jour votre question avec un exemple spécifique de ce dont vous avez besoin? Je veux dire copier d'où (mysql sera délicat) et où.
terdon
1
@PrayagUpd voir la réponse mise à jour pour une autre astuce.
terdon
1

@evilsoup a suggéré une bonne solution mais elle casse souvent.

Une solution rapide

Voici une solution qui ne casse jamais .

history | tail -2 | head -1 | xclip -selection clipboard

Exécutez simplement cette commande et elle copiera la commande que vous venez d'exécuter dans le presse-papiers.

Fondamentalement, ce qu'il fait, c'est qu'il imprime votre historique de commandes et prend l'avant-dernière commande et l'alimente dans votre presse-papiers (la dernière commande est elle-même, donc il sélectionne l'avant-dernière commande).

Une fonction personnalisée

En développant la solution rapide, voici une petite fonction que j'ai écrite qui est assez intelligente et copiera la dernière commande utilisée. Vous pouvez également fournir des arguments numériques pour copier la dernière commande. Par exemple, pour copier l'avant-dernière commande fournir 2comme argument

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Copiez-collez la fonction ci-dessus dans votre ~/.bashrcfichier. Notez que si vous placez cela dans un fichier de script bash séparé et exécutez le script, cela ne fonctionnera pas car la commande history ne pourra pas accéder à votre historique dans ce cas.

Enfin, exécutez-le en tant que:

myclipcopy 3
# This copies the third-last command

De plus, une fonctionnalité intéressante ajoutée à cette fonction est qu'elle se supprime de l'historique après son exécution. Cela est utile car l'index "en arrière" des commandes ne change pas.

shivams
la source
Ce n'est pas robuste .
mikeserv
@mikeserv: Je l'ai renommé maintenant en "Fonction personnalisée". Mais pourquoi avez-vous voté contre? Ne remarquez-vous pas que cela répond correctement à la question? De plus, la raison pour laquelle j'ai dit "robuste" était parce qu'il ne devrait jamais se casser. En rétrogradant, vous cachez simplement une réponse appropriée dans le message.
shivams
J'ai voté contre parce que vous supposez beaucoup : en particulier bash et linux, aucun des deux n'est spécifié dans la question. De plus, votre pipeline est ridiculement trop compliqué, et il en va de même pour votre regex
mikeserv
@mikeserv: Merci pour le commentaire. J'espère que cela m'aidera à produire de meilleures réponses. J'accepterai que mes regex et pipelines sont moches. Mais ils sont bien testés et je l'utilise. Et en ce qui concerne les hypothèses, avez-vous remarqué que la réponse la mieux notée avait pris l'hypothèse que l'utilisateur utilisait screen. La deuxième réponse la mieux notée avait également supposé bashet linux. De plus, supposer bashn'est pas un gros problème car le script fonctionnerait toujours dans zsh ou dans la plupart des autres shells.
shivams
Je n'ai pas dit que c'était moche - j'ai dit que c'était trop compliqué. Et non, cela ne fonctionnera pas bien dans la plupart des autres coquilles . Et de plus, l' interface CLI représentée dans la question est MySQL. Bon point sur les autres réponses, cependant.
mikeserv
0

Cette commande utilise l'expansion de l'historique de bash (se !!développe donc dans la dernière ligne que vous avez tapée dans le terminal). Vous devrez probablement installer soit xclipou xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Cela placera votre dernière commande dans le presse-papiers Ctrl+ v, vous pourrez donc coller dans n'importe quel programme GUI (ou avec Ctrl+ Shift+ vdans la plupart des émulateurs de terminal, ou avec "+pdans vim).

Cela se cassera pour certaines lignes contenant des guillemets doubles, par exemple:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Cela fonctionnera cependant pour la commande que vous avez donnée en exemple; vous ne devriez avoir de problèmes que si les guillemets doubles s'échappent ; & && | ||et ainsi de suite.

evilsoup
la source
Merci pour cette réponse, c'était la solution la plus pratique que j'ai pu mettre en œuvre immédiatement. Et je crois que les problèmes avec "peuvent être évités simplement en ne citant pas du tout !!, faites-le echo !!et cela fonctionnera parfaitement (sauf dans le cas improbable où votre commande précédente a commencé avec -nou -eou les quelques autres options qui echose prennent).
sundar
0

Ce n'est peut-être pas la solution la plus pratique mais je l'utilise et elle peut donc être utile pour d'autres plus elle ne nécessite aucune installation logicielle supplémentaire.

  1. Vous devez créer un fichier temporaire dans n'importe quel répertoire pratique

  2. Transférez la direction ou le texte requis dans ce fichier. Pour transférer la direction, vous pouvez utiliser

    echo $(pwd) 1> tempo
    
  3. Pour obtenir des instructions à partir de la commande d'utilisation de fichier

    cd $(tail -n 1 tempo)
    

Pour copier et coller des commandes, ce système fonctionnera bien sûr. J'espère que cela a été utile

Dmitriy Kormulev
la source
Merci Kusalananda pour l'édition. Maintenant, la réponse est bien meilleure
Dmitriy Kormulev