Mi respuesta ofrece un comando simple en tres sintaxis diferentes, que funcionan todas por igual, pero una es un poco más corta y más fácil de escribir que la segunda. La tercera variación es un llamado alias, lo que significa que puede asignar al comando un nombre personalizado y llamarlo ejecutándolo sin tener que recordar las cosas complejas.
Preparación:
Primero, instale el paquete xsel
que le permite acceder al portapapeles X desde la terminal:
sudo apt-get install xsel
Variación de comando 1 (corta):
Después de eso, puede escribir la siguiente línea para copiar el comando anterior en el portapapeles:
xsel -ib <<<!!:q
Si desea copiar el segundo último comando, reemplácelo !!
con !-2
, para el tercer último uso, !-3
etc.
Para explicar lo que está ejecutando, aquí un breve desglose del comando:
xsel
es una herramienta de línea de comandos para acceder a los portapapeles X.
Para obtener más información, lea su página de manual en línea o ejecutándose man xsel
.
- El
-i
parámetro le dice xsel
que lea desde el stdin (generalmente esto significa entrada de teclado, pero vamos a redirigir algo aquí)
- El
-b
parámetro especifica usar el portapapeles en lugar de las selecciones "primarias" o "secundarias" de X.
<<<
es una sintaxis especial de Bash llamada "Here String".
Básicamente expande (¡no evalúa!) El argumento (¡solo uno!) Después de él y lo redirige como cadena al stdin (entrada estándar) del comando antes / después del cual se encuentra.
!!:q
se llama "comando de explosión" para la expansión de la historia en bash. Se reemplaza con cualquier línea de comando previamente escrita.
Para obtener más información, lea su página de manual local ejecutando man history
(la página de manual en línea no es útil).
- El
!!
representa la línea de comandos anterior y es sinónimo de !-1
.
Obviamente !-2
significa entonces la segunda última línea de comando. No olvide el signo menos -
; de lo contrario, devolverá el segundo comando (tercero / ...) que haya escrito.
- Los
:q
modifica el comando Bang y le indica a Bash para encerrar la sustitución entre comillas simples ( '
) para evitar una mayor expansión de la cáscara.
Variación de comando 2 (un poco más larga):
echo !!:q | xsel -ib
echo
tiene el simple trabajo de imprimir todos sus argumentos en la salida estándar del terminal.
!!:q
se llama "comando de explosión" para la expansión de la historia en bash. Se reemplaza con cualquier línea de comando escrita anteriormente.
- El
!!
representa la línea de comandos anterior y es sinónimo de !-1
. Obviamente !-2
significa entonces la segunda última línea de comando. No olvide el signo menos -
; de lo contrario, devolverá el segundo comando (tercero / ...) que haya escrito.
- Los
:q
modifica el comando Bang y le indica a Bash para encerrar la sustitución entre comillas simples ( '
) para evitar una mayor expansión de la cáscara.
|
Es una pipa. Redirige la salida del terminal ("stdout") del comando anterior a la entrada del terminal ("stdin") del comando posterior.
xsel
es una herramienta de línea de comandos para acceder a los portapapeles X.
Para obtener más información, lea su página de manual en línea o ejecutándose man xsel
.
- El
-i
parámetro le dice xsel
que lea desde el stdin (generalmente esto significa entrada de teclado, pero vamos a redirigir algo aquí)
- El
-b
parámetro especifica usar el portapapeles en lugar de las selecciones "primarias" o "secundarias" de X.
Variación de comando 3 (alias):
Un alias bash es genial si no quieres recordar comandos largos o complicados que usas con frecuencia. Puede asignar este comando a un nombre de alias simple, que puede ejecutar en lugar del comando largo para lograr el mismo.
Desafortunadamente, dado que los comandos de explosión son una característica especial de Bash y se expanden antes de que se resuelvan los alias, no puede simplemente alias una de las variaciones anteriores porque la !!
parte no funcionará. Sin embargo, hay una solución alternativa.
Para configurar el alias, ejecute la siguiente línea en su terminal. Tenga en cuenta que puede elegir cualquier nombre de variable Bash válido en lugar de copylastcommand
:
alias copylastcommand='history -p \!\! | xsel -ib'
Sin embargo, esto solo es persistente para su sesión de Bash actual, lo que significa que el alias desaparecerá después de cerrar la ventana de terminal. Puede hacerlo persistente en cada una de sus sesiones de Bash agregando esta línea arriba al final de su ~/.bashrc
archivo, o a su ~/.bash_aliases
archivo si tiene una.
Una vez más, un breve desglose de la línea:
alias name='command'
es la sintaxis para establecer un alias en Bash. El command
se ejecutará siempre que ejecute a name
partir de ahora.
history -p \!\!
envía la línea de comando ejecutada previamente a stdout (salida estándar). Sin el -p
interruptor, no solo imprimiría, sino que también volvería a ejecutar el comando.
Tenga en cuenta que debemos escapar del flequillo ( !
) con barras invertidas ( \
), porque de lo contrario bash los expandiría cuando intentemos establecer el alias, lo que no tiene sentido ya que deben estar en el alias tal como están.
Una vez más, también puede especificar el comando [n] -th reciente reemplazando el segundo golpe con -n
, p \!-2
. Ej .
|
Es una pipa. Redirige la salida estándar ("stdout") del comando anterior al estándar de terminal ("stdin") del comando posterior.
xsel
es una herramienta de línea de comandos para acceder a los portapapeles X.
Para obtener más información, lea su página de manual en línea o ejecutándose man xsel
.
- El
-i
parámetro le dice xsel
que lea desde el stdin (generalmente esto significa entrada de teclado, pero vamos a redirigir algo aquí)
- El
-b
parámetro especifica usar el portapapeles en lugar de las selecciones "primarias" o "secundarias" de X.
<<<"!!" xsel -ib
<<<
se llama de nuevo a la estructura? Y creo que<<<!!:q xsel -ib
es mejor (dejar que el comando de explosión histórica haga la cita), ¿o no está de acuerdo?!!:q
usa comillas simples ('
) ...<<<"!!" xsel -ib
. Sí,<<<!!:q xsel -ib
es mejor, adelante.xsel
tiene una sintaxis interesantePuedes usar
xclip
:Entonces en tu caso:
c
significa portapapeles.Es posible que deba instalar
xclip
primero:EDITAR:
Si solo desea que el comando que ha escrito (no el resultado) se copie en el portapapeles, puede usar las cadenas Aquí:
O una pipa:
fuente
echo "command" | xclip -selection clipboard
... O lo convierten en un guión bajo~/.bin
:echo "$@" | xclip -selection clipboard
. Digamos que lo guarda como "cpy", entonces podríacpy youtube-dl stuff
y se copiaría al portapapeles sin ser ejecutado.echo "$@" | xclip -selection c && $@
, o algo más inteligente con eval ...Acabo de hacer un pequeño script para
zsh
eso que se usaxclip
para hacer esto:Este script copia el último comando que se ingresó en el shell / terminal al portapapeles del sistema. No funcionaría en un servidor remoto típico.
Pensé que me tomaría solo un par de minutos escribir este guión, pero me tomó sorprendentemente mucho tiempo hacerlo funcionar mientras tropezaba con la forma en que
zsh
maneja la historia.El
tail -n 2
primero y el primerosed
es tratar con el hecho de que el comando para este script en sí mismo se está registrando en el historial y, por lo tanto, obtiene dos líneas del historial y elimina el último.Este script funciona, y fue una especie de rompecabezas divertido, pero tengo mucha curiosidad si hay una manera más simple o más elegante de hacerlo
zsh
.fuente
tail
ysed
en uno o dos comandos. Esos comandos usan lo!!
que se explica aquí : debería estar disponible en ZSH ...!!
hecho parece que sería útil aquí, ¡gracias!Estoy usando como administrador del portapapeles, entonces.
Último comando al portapapeles
Portapapeles para rayar vim
ZSH específico
Creo que estas ideas pueden ayudarte a crear tu propia solución
fuente