web-dev-qa-db-fra.com

Comment copier une ligne de commande complète dans mon presse-papiers, sans la souris?

Imaginez que j'ai cette ligne dans mon terminal:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

Après l'avoir testé, j'aimerais copier cette ligne ci-dessus dans mon presse-papiers et la coller dans un fichier script. pas la sortie de la commande. Mais, cela sans utiliser la souris. J'aime ne garder que les mains au clavier. Je pense que c'est plus rapide comme ça, de faire du codage :)

20
Valter Silva

Ma réponse propose une commande simple en trois syntaxes différentes, qui fonctionnent toutes de la même manière, mais l’une est un peu plus courte et plus facile à taper que la seconde. La troisième variante est un pseudonyme, ce qui signifie que vous pouvez attribuer un nom personnalisé à la commande et l'appeler en l'exécutant sans avoir à vous souvenir des éléments complexes.

Préparation:

Tout d’abord, installez le paquet xsel qui vous permet d’accéder au presse-papiers X depuis le terminal:

Sudo apt-get install xsel

Variation de commande 1 (courte):

Après cela, vous pouvez taper la ligne suivante pour copier la commande précédente dans le presse-papiers:

xsel -ib <<<!!:q

Si vous voulez copier la deuxième commande la plus récente, remplacez !! par !-2, pour la troisième utilisation la plus récente !-3 et ainsi de suite.

Pour expliquer ce que vous utilisez, voici un bref aperçu de la commande:

  • xsel est un outil de ligne de commande permettant d'accéder aux presse-papiers X.
    Pour plus d’informations, lisez sa page de manuel en ligne Manpage icon ou en exécutant man xsel.

    • Le paramètre -i indique à xsel de lire depuis le stdin (cela signifie généralement une entrée au clavier, mais nous allons rediriger quelque chose ici).
    • Le paramètre -b spécifie d'utiliser le presse-papiers au lieu des sélections "principales" ou "secondaires" de X.
  • <<< est une syntaxe spéciale de Bash appelée "Here String".
    Il développe essentiellement (pas évalue!) L'argument (un seul!) Après lui et le redirige sous forme de chaîne vers le stdin (entrée standard) de la commande avant/après laquelle il se trouve.

  • !!:q est appelé une "commande bang" pour le développement de l'historique dans bash. Il se remplace par une ligne de commande précédemment saisie.
    Pour plus d’informations, lisez la page de manuel locale en exécutant man history (la page de manuel en ligne n’est pas utile).

    • !! représente la ligne de commande précédente et est synonyme de !-1.
      Évidemment, !-2 signifie alors l'avant-dernière ligne de commande. N'oubliez pas le signe moins -, sinon il retournera la 2e (3ème/...) commande que vous avez déjà saisie.
    • Le :q modifie la commande bang et indique à bash de mettre la substitution entre guillemets simples (') afin d'empêcher toute expansion supplémentaire par le shell.

Variation de commande 2 (légèrement plus longue):

echo !!:q | xsel -ib
  • echo a pour tâche simple d'imprimer tous ses arguments sur la sortie standard du terminal.

  • !!:q est appelé une "commande bang" pour le développement de l'historique dans bash. Il se remplace par une ligne de commande précédemment saisie.

    • !! représente la ligne de commande précédente et est synonyme de !-1. Évidemment, !-2 signifie alors l'avant-dernière ligne de commande. N'oubliez pas le signe moins -, sinon il retournera la 2e (3ème/...) commande que vous avez déjà saisie.
    • Le :q modifie la commande bang et indique à bash de mettre la substitution entre guillemets simples (') afin d'empêcher toute expansion supplémentaire par le shell.
  • | est un tuyau. Il redirige la sortie du terminal ("stdout") de la commande précédente vers l'entrée de terminal ("stdin") de la commande suivante.

  • xsel est un outil de ligne de commande permettant d'accéder aux presse-papiers X.
    Pour plus d’informations, lisez sa page de manuel en ligne Manpage icon ou en exécutant man xsel.

    • Le paramètre -i indique à xsel de lire depuis le stdin (cela signifie généralement une entrée au clavier, mais nous allons rediriger quelque chose ici).
    • Le paramètre -b spécifie l'utilisation du presse-papiers au lieu des sélections "principales" ou "secondaires" de X.

Variation de commande 3 (alias):

Un alias bash est une bonne chose si vous ne voulez pas vous souvenir de commandes longues ou compliquées que vous utilisez souvent. Vous pouvez affecter cette commande à un nom d'alias simple, que vous pouvez exécuter à la place de la commande longue pour obtenir le même résultat.

Malheureusement, les commandes bang étant une fonctionnalité spéciale de Bash et développées avant que les alias ne soient résolus, vous ne pouvez pas simplement aliaser l'une des variantes ci-dessus car la partie !! ne fonctionnera pas. Il y a cependant une solution de contournement.

Pour définir l'alias, exécutez la ligne suivante dans votre terminal. Notez que vous pouvez choisir n'importe quel nom de variable Bash valide au lieu de copylastcommand:

alias copylastcommand='history -p \!\! | xsel -ib'

Toutefois, cela n’est persistant que pour votre session Bash actuelle, ce qui signifie que l’alias disparaîtra après la fermeture de la fenêtre du terminal. Vous pouvez le rendre persistant dans chacune de vos sessions Bash en ajoutant cette ligne à la fin de votre fichier ~/.bashrc ou à votre fichier ~/.bash_aliases si vous en avez un.

Encore une fois, une brève rupture de la ligne:

  • alias name='command' est la syntaxe permettant de définir un alias dans Bash. La command sera exécutée à chaque fois que vous exécuterez name.

  • history -p \!\! renvoie la ligne de commande précédemment exécutée sur stdout (sortie standard). Sans le commutateur -p, il ne ferait pas qu'imprimer mais aussi relancer la commande.
    Notez que nous devons échapper à la frange (!) avec des barres obliques inverses (\), car sinon bash les développerait lorsque nous essayons de définir le pseudonyme, ce qui n'a aucun sens car besoin d'être dans l'alias comme ils sont.
    Encore une fois, vous pouvez également spécifier la [n]-ème commande récente en remplaçant le second bang par -n, par exemple. \!-2.

  • | est un tuyau. Il redirige la sortie standard ("stdout") de la commande précédente vers le terminal standard ("stdin") de la commande suivante.

  • xsel est un outil de ligne de commande permettant d'accéder aux presse-papiers X.
    Pour plus d’informations, lisez sa page de manuel en ligne Manpage icon ou en exécutant man xsel.

    • Le paramètre -i indique à xsel de lire à partir du stdin (cela signifie généralement une entrée au clavier, mais nous allons rediriger quelque chose ici).
    • Le paramètre -b spécifie d'utiliser le presse-papiers au lieu des sélections "principales" ou "secondaires" de X.
22
Byte Commander

Vous pouvez utiliser xclip:

some_command | xclip -selection c

Donc dans votre cas:

youtube-dl .... | xclip -selection c

c signifie Presse-papiers.

Vous devrez peut-être installer xclip en premier:

Sudo apt-get install xclip

EDIT:

Si vous voulez simplement que la commande que vous avez tapée (pas la sortie) soit copiée dans le presse-papiers, vous pouvez utiliser les chaînes Here:

 xclip -selection c <<<"$(echo foobar)"

Ou une pipe:

echo foobar | xclip -selection c
5
heemayl

Je viens de faire un petit script pour zsh qui utilise xclip pour faire ceci:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

Ce script copie la dernière commande entrée dans le shell/terminal dans le presse-papiers du système. Cela ne fonctionnerait pas sur un serveur distant typique.

Je pensais que cela ne me prendrait que quelques minutes pour écrire ce script, mais cela a pris un temps étonnant pour le faire fonctionner, et je suis tombé sur le chemin zsh pour gérer l'histoire.

Le tail -n 2 et le premier sed dans ceci traitent du fait que la commande de ce script lui-même est enregistrée dans l'historique, de sorte qu'il obtient deux lignes de l'historique et supprime la dernière .

Ce script fonctionne, et c'était en quelque sorte un puzzle amusant, mais je suis vraiment curieux de savoir s'il existe un moyen plus simple ou plus élégant de faire cela avec zsh.

3
alec

J'utilise comme gestionnaire de presse-papiers, donc.

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

Dernière commande dans le presse papier

alias last2cb='fc -ln -1 | pbcopy'

Presse-papiers pour vim scratch

alias vcb='pbpaste | vimscratch -'

ZSH spécifique

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

Je pense que ces idées peuvent vous aider à créer votre propre solution

0
SergioAraujo