Terminal: copie desde la CLI sin usar el mouse

20

Al disparar comandos en CLI, quiero copiar el comando que acabo de disparar o cualquier cosa que escribí en la terminal y pegarlo en otro lugar sin usar el mouse.

Como en la siguiente imagen, quiero copiar el comando de actualización (total o parcialmente) sin usar el mouse y pegarlo en alguna parte.

copiar desde la CLI sin usar el mouse

prayagupd
fuente
1
¿Estás usando gnome sin un mouse?
ott--

Respuestas:

11

Se puede utilizar screen(1) dentro de su emulador de terminal de elección ( xterm, gnome-terminal, ...).

La funcionalidad que necesita está incorporada screen. Debe familiarizarse con la forma en que funciona:

  • por defecto, la combinación de Ctrlteclas "comando" es + A, usted compone los comandos emitiendo la secuencia "comando" más la acción específica.
  • el comando "copiar" es: AltGr+[
  • el comando "pegar" es AltGr+]

Puede "copiar" el comando y "pegar" en otro terminal.

screen es divertido y una vez que comiences a usarlo, te preguntarás cómo es posible que no lo hayas usado en absoluto.

Dawud
fuente
No había ningún screencomando, así que lo instalé en gnome-terminal y comencé screenen una terminal. Pero no pudo comenzar a partir de entonces. Además, no entendí lo que quieres decir con pantalla incorporada.
prayagupd
1
Leer man screen. También, escribí 'incorporado en la pantalla', es decir, el copiar / pegar funcionalidad está presente en screen por diseño .
dawud
Debe usar la spacetecla para seleccionar el área deseada. Debe usar Ypara copiar toda la línea o área deseable. La pantalla es viamigable con los movimientos.
FelikZ
¿Qué es la AltGrclave? TengoAlt
alhelal
1
La screenherramienta no funciona se ha explicado aquí. Y no parece dar una respuesta a la pregunta.
Luís de Sousa
7

Además de las respuestas ya proporcionadas, podría considerar pasar a un emulador de terminal más flexible.

Si estaba preparado para cambiar terminales a rxvt-unicode , podría usar una herramienta como urxvt-perls : una colección de scripts que proporcionan la siguiente funcionalidad de teclado en ese emulador de terminal:

  • seleccionar, copiar y pegar texto
  • búsqueda hacia adelante y hacia atrás
  • resalte y abra las URL en su navegador preferido

Simplemente instale el paquete y luego agregue algunas líneas a su ~/.Xresources, y luego puede desconectar el roedor para siempre.

jasonwryan
fuente
4

Puedes hacer esto usando un programa como xclip:

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

Una vez que lo haya instalado, puede usarlo para conectarse a su portapapeles X. Desafortunadamente, esto no funcionará en su mysqlentorno (tiene su propio búfer para líneas copiadas), pero lo hará si desea ejecutar un comando 'normal'. Por ejemplo :

$ This is a long command line

Escriba CtrlApara ir al comienzo de la línea, encierre el comando entre comillas y luego repítalo:

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

Ahora tiene "Esta es una línea de comando larga" en su portapapeles de clic central.

Si desea pegar sin usar un mouse, dependerá de dónde esté pegando. Puede pegar en otro terminal ejecutando:

$ xclip -o

Puede pegar en el mismo terminal, simplemente matando (cortando) el comando con CtrlKy luego pegando con CtrlY.

También puede guardar comandos en terminales utilizando el historial de bash. Agregue esta línea a su ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDes una variable bash especial. Si se establece, el valor se ejecuta como un comando antes de emitir una nueva solicitud. history -aescribirá el historial de la sesión actual en el archivo de historial y history -rvolverá a cargar ese archivo. Esto significa que cada comando que ejecute se escribirá inmediatamente en el archivo de historial.

Ahora, cuando ejecuta una línea de comando larga, puede cambiar a otra terminal y presionar regresar (solo para ejecutar $PROMT_COMMAND, alternativamente, abrir una nueva ventana de terminal) y estará accesible para el historial de esta terminal. Si ahora golpeas Uppuedes ejecutarlo en la nueva terminal.

terdon
fuente
Eso está bien, pero todavía tengo que usar el mouse.
prayagupd
@PrayagUpd ah, sí, eso se copiará en el búfer de clic central. Ver respuesta actualizada para otra forma.
terdon
Creo que $ xclip -ono es lo que quiero porque solo imprime lo que hice xclipe. Pero +1 para Ctrl+Aseguido por Ctrl+Ky Ctrl+Ypara cortar y pegar al menos en la misma terminal.
prayagupd
@PrayagUpd la cuestión es que hay varios buffers de portapapeles en juego y la solución dependerá de lo que quieras hacer exactamente. ¿Podría actualizar su pregunta con un ejemplo específico de lo que necesita? Me refiero a copiar desde dónde (mysql será complicado) y hacia dónde.
terdon
1
@PrayagUpd ver respuesta actualizada para otro truco.
terdon
1

@evilsoup ha sugerido una buena solución, pero se rompe a menudo.

Una solución rápida

Aquí hay una solución que nunca se rompe .

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

Simplemente ejecute este comando y copiará el comando que acaba de ejecutar en el portapapeles.

Básicamente, lo que hace es que imprime su historial de comandos y toma el segundo último comando y lo alimenta al portapapeles (el último comando es este mismo, por lo que selecciona el segundo último comando).

Una función personalizada

Desarrollando en la solución rápida, aquí hay una pequeña función que escribí que es bastante inteligente y copiará el último comando utilizado. También puede proporcionar argumentos numéricos para copiar el último enésimo comando. Por ejemplo, para copiar el segundo último comando proporcionar 2como argumento

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
}

Copie y pegue la función anterior en su ~/.bashrcarchivo. Tenga en cuenta que si coloca esto en un archivo de script bash separado y ejecuta el script, no funcionaría ya que el comando de historial no podría acceder a su historial en ese caso.

Finalmente, ejecútalo como:

myclipcopy 3
# This copies the third-last command

Además, una característica interesante añadida a esta función es que se elimina del historial después de ejecutarse. Esto es útil porque el índice "hacia atrás" de los comandos no cambia.

shivams
fuente
Esto no es robusto .
mikeserv
@mikeserv: lo he renombrado ahora como "Función personalizada". Pero, ¿por qué lo rechazaste? ¿No notas que esto responde adecuadamente la pregunta? Además, por qué dije "robusto" fue porque en realidad nunca debería romperse. Al votar negativamente, solo está ocultando una respuesta apropiada de la publicación.
Shivams
Voté en contra porque usted asume mucho : particularmente bash y linux, ninguno de los cuales se especifica en la pregunta. Además, su canalización es ridículamente complicada, y lo mismo ocurre con su expresión regular
mikeserv
@mikeserv: Gracias por el comentario. Espero que esto me ayude a producir mejores respuestas. Aceptaré que mi expresión regular y mis tuberías son feas. Pero están bien probados y lo he estado usando. Y en cuanto a las suposiciones, ¿notó que la respuesta mejor calificada había asumido que el usuario estaba usando screen? La segunda respuesta mejor calificada también había asumido bashy linux. Además, suponer bashque no es un gran problema porque el script aún funcionaría para encontrar en zsh o en la mayoría de los otros shells.
Shivams
No dije que fuera feo, dije que era demasiado complicado. Y no, no funcionará bien en la mayoría de los otros depósitos . Y lo que es más, la CLI que se muestra en la pregunta es MySQL. Buen punto sobre las otras respuestas, sin embargo.
mikeserv
0

Este comando utiliza la expansión del historial de bash (se !!expande en la última línea que ingresó en la terminal). Probablemente tendrá que instalar uno xclipo xsel.

echo "!!" | xclip -selection clipboard

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

Esto colocará su último comando en el portapapeles Ctrl+ v, por lo que podrá pegarlo en cualquier programa GUI (o con Ctrl+ Shift+ ven la mayoría de los emuladores de terminal, o con "+pin vim).

Esto se romperá para algunas líneas que contienen comillas dobles, por ejemplo:

$ 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

Sin embargo, funcionará para el comando que dio como ejemplo; solo deberías tener problemas si las comillas dobles escapan ; & && | ||y así sucesivamente.

maldad
fuente
Gracias por esta respuesta, esta fue la solución más práctica que pude implementar de inmediato. Y creo que los problemas con "pueden evitarse simplemente no citando el código !!, simplemente hazlo echo !!y funcionará sin problemas (excepto en el caso improbable de que tu comando anterior comenzara con -no con -elas pocas otras opciones que echotoma).
Sundar - Restablecer Monica
0

Tal vez no sea la solución más conveniente, pero la uso y, por lo tanto, puede ser útil para otros, ya que no requiere ninguna instalación suave adicional.

  1. Necesita crear un archivo temporal en cualquier directorio conveniente

  2. Transfiera la dirección o texto requerido a ese archivo. Para transferir dirección puede usar

    echo $(pwd) 1> tempo
    
  3. Para obtener la dirección del archivo, use el comando

    cd $(tail -n 1 tempo)
    

Para copiar y pegar comandos, este sistema funcionará, por supuesto. Espero que haya sido útil

Dmitriy Kormulev
fuente
Kusalananda gracias por editar. Ahora la respuesta se ve mucho mejor
Dmitriy Kormulev