A menudo me encuentro en la siguiente posición: comencé a escribir un comando largo en el indicador bash, pero a mitad de camino descubro que necesito verificar algo con otro comando. Este es un problema cuando estoy en la consola (no X), que a menudo es el caso, porque entonces solo tengo las siguientes formas insatisfactorias de hacerlo, que conozco:
- Presione ctrl+ alt+ F2e inicie sesión en otra consola virtual, y descubra lo que quería, luego regrese y continúe
- ctrl+ a, escriba echo + space+ enter, descubra lo que quería, presione ↑hasta que encuentre mi comando, ctrl+ a, delx 5, ctrl+ ey continúe
- Resalte lo que he escrito hasta ahora con mi mouse (si gpm se está ejecutando, que generalmente es), presione ctrl+ cpara interrumpir, descubra lo que quería mientras tiene cuidado de no usar mi mouse para resaltar cosas, luego presione el botón central del mouse en un nuevo aviso y continuar
- Ore a los dioses de la línea de comando para que el comando medio escrito no tenga efectos adversos, sino que simplemente falle, y presione con cautela enter, luego descubra lo que quería, presione uparrow hasta que recupere mi comando y continúe
- Salto a mi máquina del tiempo, viajo en el tiempo y me recuerdo a mí mismo para iniciar la pantalla antes de comenzar a escribir el comando, viajar al presente, presionar ctrl+ a c, averiguar lo que quería, presionar ctrl+ a ctrl+ay continuar
Entonces, lo que quiero saber es, ¿hay alguna forma más elegante de hacer esto? ¿Una especie de comando subshell o similar?
Estoy más interesado en métodos que no requieren ninguna preparación o configuración para funcionar.
fuente
zsh
ella corta toda la línea, pero enbash
ella corta hacia atrás. Nunca noté esa diferencia antes^U
^K
tendrá el mismo efecto^A
^K
pero es marginalmente más ergonómico y significativamente más conveniente debajoscreen
.Haga Ctrl-A para llegar al inicio de la línea, anteponga un hash y presione Intro; de esta manera, permanecerá en el historial de comandos como un comentario y podrá volver a él con el cursor hacia arriba
EDITAR: acabo de notar que esta es una variante un poco más elegante en su # 2;)
fuente
csh
ozsh
porque no permiten comentarios en el shell interactivo. Enzsh
lo que necesita para activar la opción correcta:setopt interactive_comments
.:
debe considerarse dañino para este propósito y nunca, nunca debe sugerirse. Ejecutará todo después de un punto y coma, backticks internos, etc. con todos los efectos secundarios asociados.Pulse
Ctrl+A
,Ctrl+K
para moverse al inicio de la línea y eliminar (matar) al final de la misma. Luego investigue, y cuando esté listo para continuar, golpeeCtrl+Y
(tire) para volver a colocar su línea guardada (asesinada).fuente
En zsh, escribo Ctrl+ Zpara "suspender" el comando que estoy escribiendo y escribo otro comando. Después de ejecutar ese comando (o abortarlo con Ctrl+ C), el comando suspendido regresa para edición (incluso recordando la posición del cursor). Como conveniencia adicional, si la línea de comando está vacía cuando escribo Ctrl+ Z, la tecla invoca la función
bg
incorporada (por lo tanto, un doble Ctrl+ Zenvía un comando en ejecución directamente al fondo).No sé cómo hacer algo similar en bash.
En cualquier shell, puede usar el método de baja tecnología de agregar un
#
al comienzo de la línea actual .fuente
zsh
tiene una función incorporada ? Se llamapush-line
y todo lo que necesita hacer es usarlobindkey
para acceder.push-input
lugar depush-line
aquí,push-line
parece más apropiado (¿quizás solo las versiones antiguas de zsh teníanpush-input
?). Pero eso no es un reemplazo para el resto de la función.push-line
es inútil en una línea vacía, teniendobg
enCtrl+Z
sólo es útil cuando sólo he suspendido ese proceso conCtrl+Z
) y la tecla de acceso (estoy bien backgrounding el proceso o la línea de comando parcial).push-input
suspende todo el búfer de entrada, mientras quepush-line
solo suspende la línea actual. Si estoy escribiendo un comando multilínea, quiero suspender todo el comando, así quepush-input
es el correcto. Encuentropush-input
más útil quepush-line
(si quiero retrasar una línea en un búfer de entrada multilínea, simplemente puedo navegar hasta el comienzo de la línea e insertar una nueva línea), así que de hecho me pregunto por quépush-line
obtuve la combinación de teclas predeterminada y nopush-input
.En bash, solo escribe Alt+ #.
Luego, cuando esté listo, presione Upy luego Alt+ #.
El primero coloca un
#
al comienzo de la línea para convertirlo en un comentario, luego acepta la línea, como si hubiera presionado Enter.Luego, cuando lo haces por segunda vez, ve que la línea ya tiene un
#
al comienzo, por lo que la elimina y la acepta, de nuevo guardándote la Enterclave.Si la segunda vez solo inserta otra
#
, entonces debe escribir Alt+ - Alt+ en su #lugar.Puedes hacer que zsh haga lo mismo poniendo
en tu ~ / .zshrc.
O, si está utilizando enlaces vi, puede escribir #desde el modo de comando tanto en bash como en zsh.
fuente
Esc+1
entoncesAlt
+#
para alternar.Una de mis características favoritas
zsh
es la función de línea push incorporada que se encarga de esto sin ninguna de la piratería en otras respuestas aquí. Lo tengo vinculado a Ctrl+ len mi.zshrc
archivo así:Luego, cuando estoy escribiendo algún comando y necesito hacer algo más rápido, puedo invocarlo con una tecla y obtener un mensaje en blanco. Después de ejecutar el otro comando, la solicitud se completa automáticamente con lo que estaba escribiendo antes.
Incluso puede encadenar varias capas de esto y los comandos volverán a usted en orden inverso al que los empujó a la cola.
fuente
Ctrl+Q
yESC q
por defecto (en modo emacs).push-line-or-edit
widget, que no está vinculado en ningún mapa de teclas de forma predeterminada. En el indicador de nivel superior, hace lo mismopush-line
, pero en cualquier nivel de indicador inferior, convierte todo el comando que se ingresa en un búfer de varias líneas. ¡Dos excelentes funciones en una combinación de teclas! Puedo recomendar encuadernación enpush-line-or-edit
lugar de simplepush-line
. No pierde nada y obtiene una funcionalidad útil.Además del ctrl- a ctrl- ktruco, si está en la pantalla, solo ctrl- a dpara separar y volver a conectar con
screen -r
También podría simplemente abrir otra ventana con ctrl+a c
fuente
Ctrl+A c
.Una forma alternativa, aunque no perfecta, es presionar
Ctrl-X
Ctrl-E
. Esto abrirá su editor predeterminado que contiene su comando medio escrito. Luego puede guardar su comando en un archivo o abrir un nuevo shell desde su editor. Cuando salga del nuevo shell, lo devolverá al editor y guardar el contenido los ejecutará automáticamente.Esto no es perfecto porque no lo devuelve a su shell original, sino que fuerza la ejecución del comando o lo descarta por completo. Pero no hay selecciones temporales o buffers de muerte por los que preocuparse, y también hay algunos ajustes agradables, por ejemplo, si editor = vi
fuente
sudo update-alternatives --config editor
y elige tu editor favorito. Para otros sistemas, configure las variables de entorno EDITOR o VISUAL en su editor favorito, por ejemplo, agregueexport EDITOR=/usr/bin/nano
su .bashrc.Similar al método de agregar
#
al comienzo de la línea, hay un método posiblemente más simple que utilizo que no requiere volver al comienzo de la línea:Simplemente agregue una cotización abierta y no la cierre, ya sea simple o doble.
Luego presione Enter.
Luego presione CtrlC.
El comando parcial se guarda en el historial de comandos (disponible mediante la flecha hacia arriba) pero en realidad no se ejecuta.
fuente
Usando zsh, si escribe
<ESC> q
(escape, luego Q), su línea de solicitud se cortará, para que pueda escribir otro comando. Recuperará automáticamente el texto cortado en la próxima solicitud.Puede recordar varias líneas al mismo tiempo, por lo que puede usarlo mientras le espera una línea. Incluso puede usarlo en una línea en blanco para retrasar la reanudación de su línea de corte.
No es la forma más eficiente si tiene que usar varios comandos para la verificación / preparación (deberá volver a escribir
<ESC> q
antes de cada comando). Pero creo que es posible vincularlo a un atajo más corto.Si solo desea consultar el manual, escriba
<ESC> h
(escape, luego H). Eso ejecutará elrun-help
incorporado, con la primera palabra de la línea de comando como argumento. Volverás a encontrar tu línea intacta una vez hecho.fuente
M-q
lugar de<ESC> q