copier la dernière commande du terminal

21

Je peux voir la dernière commande du terminal en appuyant sur up arrowcomme dans l'exemple suivant:

J'ai tapé cd /:

Makss-Mac:~ maks$ cd /

... appuyé enter, commande cd /exécutée et maintenant je peux appuyer up arrowet voir à cd /nouveau commande :

Makss-Mac:/ maks$ cd /

Je veux non seulement voir la dernière commande, mais la copier dans le presse-papier.

Peut-être existe-t-il un raccourci qui montre non seulement la dernière commande dans le terminal (comme le up arrowfait), mais en même temps, la copie dans le presse-papier.

Ou peut-être existe-t-il un raccourci pour sélectionner tous les éléments de la ligne de terminal actuelle. Et ainsi je pourrai copier la dernière commande (après avoir appuyé up arrow) en appuyant sur super+c. Bien sûr, je peux le sélectionner avec la souris. Mais lorsque les commandes sont 10 fois plus longues que cd /cela peut prendre beaucoup de temps, surtout si vous le faites toutes les 30 secondes.

Ou peut-être qu'il y a moyen d'écrire un plugin pour Terminal

Maxim Yefremov
la source
Il serait peut-être plus facile de trouver une solution ici si vous pouviez ajouter quelques détails sur ce que vous avez l'intention de faire avec le contenu du presse-papiers par la suite. Où allez-vous le coller?
nohillside
oui pour le coller dans un autre onglet du terminal
Maxim Yefremov

Réponses:

17

Mettez ceci dans votre ~/.bashrc ~/.bash_profileou partout où vous l'aimez:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

Après avoir ouvert une nouvelle fenêtre (ou en cours d’exécution source ~/.bash_profile), vous devriez pouvoir exécuter copyLastCmdet avoir la commande dans le presse-papiers.

Pour expliquer ce qui se passe: vous utilisez essentiellement "fix command" ( fc) pour obtenir la dernière commande, supprimez les espaces de début et de fin pour obtenir un formatage plus agréable avec awk, puis copiez-les dans le presse-papiers de votre Mac pbcopy.

MODIFIER:

Maintenant que nous savons que vous souhaitez copier pour coller dans un autre onglet de terminal, il existe une autre option: Ajoutez ces lignes à votre ~/.bashrc ~/.bash_profileou à l'endroit où vous l'aimez:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Ensuite, une fois que vous avez ouvert de nouveaux onglets (appelons-les "onglet A" et "onglet B"):

  1. Exécutez n'importe quelle commande dans l'onglet A
  2. Passez à l'onglet B, appuyez sur Entrée sur une ligne vide , ce qui vous donne une "nouvelle" ligne nouvelle (et réévalue ainsi l'historique).
  3. utilisez la flèche vers le haut une fois et vous devriez avoir la commande que vous venez d'entrer dans l'onglet A.

EDIT 2: J'ai remplacé l'usage de sedwith awkdans la réponse originale ci-dessus, afin de prendre soin des espaces de début et de fin.

Asmus
la source
C'est un super alias! Pour couper la fin de la nouvelle ligne afin de pouvoir modifier la commande après le collage, j'ai utilisé awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler
@ nwinkler: OH, vous avez raison, vous auriez dû utiliser awk: fc -ln -1 | awk '{$1=$1}1'supprimera les espaces blancs de fin et de début.
Asmus
1
dû modifier l'alias pour les caractères spéciaux alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". obtient toujours mon upvote
Mike D
1
Je l'ai utilisé jusqu'à ce que je fasse un "git -reset --hard" sur un terminal et que dans un autre "dossier git sans méfiance", j'ai appuyé sur la flèche et entré à la hâte car je pensais exécuter un script que j'utilisais auparavant. Vous pouvez imaginer ce qui s'est passé, et c'est la dernière fois que j'ai utilisé cette histoire "globale" partagée
MrGigu
@MrGigu m'est arrivé avec une histoire "locale" où j'ai appuyé sur la flèche "haut" deux fois, au lieu d'une fois, accidentellement - les leçons apprises à la dure, je suppose.
Asmus
3

Vous pouvez définir votre historique pour ignorer les commandes commençant par un espace:

export HISTIGNORE=' *'

Et puis exécutez la commande suivante pour git la dernière commande dans le presse-papiers (assurez-vous que vous avez un espace au début):

history 1 | cut -d " " -f 4- | pbcopy

Vous voudrez probablement alors enregistrer la commande sous un alias pour le rendre plus facile à mémoriser.

Kidbrax
la source
3

Voici une autre prise basée sur la réponse de @Asmus. Pour que son alias fonctionne dans mon script bash, je devais utiliser un peu de citation, car les guillemets simples ne fonctionnent pas dans un alias à une seule citation sans quelques citations supplémentaires:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

Le '\''va essentiellement fermer la citation actuelle, puis ajouter une citation échappée, puis rouvrez la citation réelle.

La version ci-dessus copiera la dernière commande dans votre presse-papiers et, une fois celle-ci collée, elle sera immédiatement exécutée, car elle comportera une nouvelle ligne à la fin.

Pour vous débarrasser de la nouvelle ligne à la fin et pouvoir ainsi modifier la commande avant de l'exécuter, procédez comme suit:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

Le ORS=''(sans les guillemets) enlèvera le caractère de fin de ligne suivant, vous pourrez donc éditer le texte collé avant de l'exécuter.

nwinkler
la source
3

Cela utilisera l’extension de l’historique pour récupérer la dernière commande et l’envoyer en écho. Vous pouvez diriger vers pbcopypour enregistrer la dernière commande dans votre presse-papiers.

> echo !! | pbcopy

Si vous voulez une commande de votre historique qui ne soit pas la dernière , vous pouvez exécuter:

> history

Et référencer le numéro de commande désiré comme:

> echo !5 | pbcopy
Sam Berry
la source
C'est peut-être votre préféré, et cela peut même fonctionner, mais vous devez fournir une petite explication sur ce que fait réellement la commande et comment le PO (qui a accepté l'une des réponses il y a cinq ans) peut l'utiliser efficacement.
IconDaemon
@IconDaemon bon appel. Je pense que cela vaut la peine d’ajouter à une vieille question car c’est plus simple que la réponse acceptée, car elle ne nécessite aucune personnalisation de profil.
Sam Berry
3

Je suis venu ici avec la réponse exacte de Sam Berry, mais cela ne fonctionne pas pour moi (OSX 10.14.6).

J'ai réussi à le faire avec des guillemets autour de !!:

echo "!!" | pbcopy

Chris Gillatt
la source