30 votes

copier la dernière commande dans le terminal

Je peux voir la dernière commande dans le terminal en appuyant sur up arrow comme dans l'exemple suivant :

J'ai tapé cd / :

Makss-Mac:~ maks$ cd /

... pressé enter , commande cd / exécuté et maintenant je peux appuyer sur up arrow et voir la commande cd / encore :

Makss-Mac:/ maks$ cd /

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

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

Ou peut-être existe-t-il un raccourci pour tout sélectionner dans la ligne courante du terminal. Et ainsi je pourrais copier la dernière commande (après avoir appuyé sur 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 trop de temps, surtout si vous le faites toutes les 30 secondes.

Ou y a-t-il un moyen d'écrire un plugin pour le terminal ?

28voto

Asmus Points 7195

Mettez ceci dans votre ~/.bashrc ~/.bash_profile ou là où vous le souhaitez :

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

Après avoir ouvert une nouvelle fenêtre (ou exécuté source ~/.bash_profile ), vous devriez être en mesure d'exécuter copyLastCmd et 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, supprimer les espaces en tête et en queue pour un meilleur formatage avec awk puis copiez-le dans le presse-papiers de votre Mac avec pbcopy .

EDIT :

Maintenant que nous savons que vous voulez copier pour coller dans un autre onglet du terminal, il existe une autre option : Ajoutez ces lignes à votre ~/.bashrc ~/.bash_profile ou là où vous le souhaitez :

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écuter toute commande dans l'onglet A
  2. Passez à l'onglet B, appuyez sur la touche Entrée d'un vide en vous donnant une nouvelle ligne "fraîche" (et donc en réévaluant l'historique).
  3. utilisez la flèche vers le haut une fois et vous devriez avoir la commande que vous venez de saisir dans l'onglet A.

EDIT 2 : J'ai remplacé l'utilisation de sed avec awk dans la réponse originale ci-dessus, pour prendre en compte les espaces avant et arrière.

15voto

Sam Berry Points 481

Cela utilisera expansion de l'histoire pour récupérer la dernière commande et la répercuter. Vous pouvez faire un pipe vers pbcopy pour enregistrer la dernière commande dans votre presse-papiers.

> echo !! | pbcopy

Si vous voulez une commande de votre historique qui n'était pas le dernier un, tu peux courir :

> history

Et référencez le numéro de commande souhaité comme :

> echo !5 | pbcopy

9voto

nwinkler Points 8556

Voici un autre point de vue basé sur la réponse de @Asmus. Pour faire fonctionner son alias dans mon script bash, j'ai dû utiliser un peu de citation, puisque les guillemets simples ne fonctionnent pas dans un alias à guillemets simples sans une citation supplémentaire :

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

Le site '\'' fermera le devis actuel, ajoutera un devis échappé, puis ouvrira à nouveau le devis actuel.

La version ci-dessus copiera la dernière commande dans le presse-papiers, et une fois que vous l'aurez collée, elle sera immédiatement exécutée, puisqu'elle aura une valeur nouvelle ligne à la fin.

Pour supprimer le saut de ligne à la fin, afin de pouvoir modifier la commande avant de l'exécuter, vous pouvez procéder comme suit :

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

Le site ORS='' (sans les guillemets) supprime le caractère de fin de ligne, ce qui vous permet de modifier le texte collé avant de l'exécuter.

8voto

Chris Gillatt Points 181

Je suis venu ici pour trouver la même réponse que Sam Berry, mais elle ne fonctionne pas pour moi (OSX 10.14.6).

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

echo "!!" | pbcopy

3voto

Adam Lerman Points 1359

Vous pouvez configurer votre historique pour qu'il ignore les commandes qui commencent par un espace :

export HISTIGNORE=' *'

Et ensuite, exécutez la commande suivante pour déposer la dernière commande dans le presse-papiers (assurez-vous d'avoir un espace au début) :

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

Vous voudrez probablement enregistrer la commande sous forme d'alias pour la rendre plus facile à retenir.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X