copiar el último comando en la terminal

22

Puedo ver el último comando en la terminal presionando up arrowcomo en el siguiente ejemplo:

Escribí cd /:

Makss-Mac:~ maks$ cd /

... presionado enter, comando cd /ejecutado y ahora puedo presionar up arrowy ver el comando cd /nuevamente:

Makss-Mac:/ maks$ cd /

No solo quiero ver el último comando, sino copiarlo en el portapapeles.

Tal vez exista un acceso directo que no solo muestre el último comando en la terminal (como lo up arrowhace) sino que al mismo tiempo lo copie en el portapapeles.

O tal vez hay un atajo para seleccionar todo de la línea de terminal actual. Y así podré copiar el último comando (después de presionar up arrow) presionando super+c. Por supuesto que puedo seleccionarlo con el mouse. Pero cuando los comandos son 10 veces más largos de cd /lo que puede llevar demasiado tiempo, especialmente si lo haces cada 30 segundos.

O tal vez hay forma de escribir un complemento para Terminal

Maxim Yefremov
fuente
Puede ser más fácil encontrar una solución aquí si luego pudiera agregar algunos detalles sobre lo que pretende hacer con el contenido del portapapeles. ¿Dónde lo vas a pegar?
nohillside
sí para pegarlo en otra pestaña del terminal
Maxim Yefremov

Respuestas:

17

Pon esto en tu ~/.bashrc ~/.bash_profileo donde quieras:

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

Después de abrir una nueva ventana (o ejecutar source ~/.bash_profile), debería poder ejecutar copyLastCmdy tener el comando en el portapapeles.

Para explicar lo que está sucediendo: básicamente está utilizando el "comando de reparación" ( fc) para obtener el último comando, elimine los espacios en blanco iniciales y finales para un mejor formato awky luego cópielo en el tablero de su Mac con pbcopy.

EDITAR:

Ahora que sabemos que desea copiar para pegar en otra pestaña de terminal, hay otra opción: agregue estas líneas a su lugar ~/.bashrc ~/.bash_profileo donde quiera:

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

Luego, una vez que tenga algunas pestañas nuevas abiertas (llamémoslas "pestaña A" y "pestaña B"):

  1. Ejecute cualquier comando en la pestaña A
  2. Cambie a la pestaña B, presione Intro en una línea vacía , dándole una nueva línea "nueva" (y así reevaluando el historial)
  3. use la flecha hacia arriba una vez y debería tener el comando que acaba de ingresar en la pestaña A.

EDITAR 2: he reemplazado el uso de sedcon awken la respuesta original anterior, para ocuparme de los espacios en blanco iniciales y finales.

Asmus
fuente
Ese es un gran alias! Para cortar la nueva línea final, para que pueda editar el comando después de pegar, utilicé awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler el
@nwinkler: OH tienes razón, debería haber usado awk: fc -ln -1 | awk '{$1=$1}1'eliminará los espacios en blanco iniciales y finales.
Asmus
1
tuvo que modificar el alias para caracteres especiales alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". todavía recibe mi voto a favor
Mike D
1
Utilicé esto hasta que hice un "git -reset --hard" en una terminal y en otra "carpeta git desprevenida" presioné la flecha hacia arriba y entré rápidamente, ya que pensé que estaba ejecutando un script que estaba usando antes. Puedes imaginar lo que pasó, y esa fue la última vez que usé esta historia "global" compartida
MrGigu
@MrGigu me sucedió con una historia "local" donde presioné la flecha "arriba" dos veces, en lugar de una, accidentalmente, supongo que las lecciones se aprendieron de la manera difícil.
Asmus
5

Aquí hay otra toma basada en la respuesta de @Asmus. Para que su alias funcione en mi script bash, tuve que usar un poco de comillas, ya que las comillas simples no funcionan en un alias entre comillas simples sin algunas comillas adicionales:

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

El '\''básicamente cerrará la cotización actual, a continuación, añadir una cita escapado, y abra la cita real de nuevo.

La versión anterior copiará el último comando en su portapapeles, y una vez que lo pegue, se ejecutará inmediatamente, ya que tendrá una nueva línea al final.

Para deshacerse de la nueva línea al final, de modo que pueda editar el comando antes de ejecutarlo, puede hacer lo siguiente:

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

El ORS=''(sin las comillas) eliminará el carácter de nueva línea final, para que pueda editar el texto pegado antes de ejecutarlo.

nwinkler
fuente
5

Esto usará la expansión del historial para tomar el último comando y repetirlo. Puede canalizar a pbcopypara guardar el último comando en su portapapeles.

> echo !! | pbcopy

Si desea un comando de su historial que no sea el último , puede ejecutar:

> history

Y haga referencia al número de comando deseado como:

> echo !5 | pbcopy
Sam Berry
fuente
Puede ser su favorito, e incluso puede funcionar, pero debe proporcionar una pequeña explicación sobre lo que realmente hace el comando y cómo el OP (que aceptó una de las respuestas hace cinco años) puede usarlo de manera efectiva.
IconDaemon
@IconDaemon buena llamada. Creo que vale la pena agregar esto a una pregunta anterior porque es más simple que la respuesta aceptada, ya que no requiere ninguna personalización de perfil.
Sam Berry
4

Vine aquí cuando se me ocurrió exactamente la misma respuesta de Sam Berry, pero no me funciona (OSX 10.14.6).

Se las arregló para hacerlo con citas alrededor de !!:

echo "!!" | pbcopy

Chris Gillatt
fuente
3

Puede configurar su historial para ignorar los comandos que comienzan con un espacio:

export HISTIGNORE=' *'

Y luego ejecute el siguiente comando para colocar el último comando en el portapapeles (asegúrese de tener un espacio al principio):

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

Probablemente quiera guardar el comando como un alias para que sea más fácil de recordar.

kidbrax
fuente