Ejecutar una subshell desde el medio del comando actual

16

Con frecuencia me encuentro en este escenario. Estoy a punto de escribir un comando y necesito verificar otra cosa antes de completarlo.

¿Hay alguna manera de abrir una subshell de algún tipo con mi entrada actual hasta ahora recordada, y luego cuando salgo de esta subshell vuelvo a donde estaba?

$ mylongcommand -n -e <SOME KEY COMBINATION WHICH OPENS A SUBSHELL>
$ date
...
$ exit
$ mylongcommand -n -e <BACK TO WHERE I WAS>

Estoy usando zsh

Panayiotis
fuente
2
¿Por qué no simplemente abrir otra ventana de terminal?
Barmar
@Barmar Para mí, no uso una GUI en la mayoría de mis sistemas Linux, por lo que tendría que cambiar los TTY. Lo que significa que tengo que volver a autenticarme. Las siguientes opciones son mucho más eficientes.
Zachary Brady
3
Puede usar screeno tmuxpara obtener múltiples terminales virtuales en la consola.
Barmar

Respuestas:

16

Existe la combinación de teclas EscQque guarda el búfer de comandos y permite ingresar un nuevo comando. Después de ejecutar el comando, el búfer contiene lo que escribió anteriormente. Si tiene que ejecutar otro comando antes de terminar esto, puede EscQvolver a escribir .

(No intenté abrir una subshell después de presionar EscQtodavía).

Consulte http://zsh.sourceforge.net/Intro/intro_10.html y busque "esc-q"

Bodo
fuente
Esto es exactamente lo que quería, ¡muchas gracias! Podría hacer que ejecute un shell anidado en lugar de regresar de inmediato, pero para mi caso de uso, regresar de inmediato funciona perfectamente.
Panayiotis
19

Normalmente uso Ctrl+ Uque borra la línea actual y la guarda en un búfer. A partir de ahí hago lo que sea que necesitaba antes del mylongcommand. Luego, cuando estoy listo, uso Ctrl+ Ypara pegar mylongcommanden mi indicador.

Recuerda un comando medio escrito mientras reviso algo

Zachary Brady
fuente
7

Mi solución a esto es decididamente de baja tecnología y torpe, pero se basa en secuencias de teclas con las que probablemente ya estés familiarizado: Hit Ctrl+ A, luego #, entonces ENTER.

Esto tiene el efecto de insertar un # al comienzo de la línea, convirtiéndolo en un comentario, luego ejecutándolo, empujándolo así en el historial de comandos. Luego puede ingresar su comando auxiliar, luego desplazarse hacia arriba a través del historial de comandos hasta el comando comentado, eliminar #y completar el comando según sea necesario.

Trauma digital
fuente
Debería presionar el botón "inicio" en su teclado, ahorra 1 pulsación de tecla y la energía requerida para presionarlo realmente
Ferrybig
@Ferrybig: sí, eso es bueno, aunque para mi mi teclado diario es un MacBook Pro que no tiene una tecla HOME . El equivalente de INICIO es FLECHA FN + IZQUIERDA , pero se desplaza hacia la parte superior de la terminal.
Digital Trauma
2

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 el bgincorporado en su lugar (entonces un doble Ctrl+Z envía un comando en ejecución directamente al fondo).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

(Publicado anteriormente en Recordar un comando medio tipeado mientras reviso algo que principalmente tiene soluciones para bash, donde no se puede hacer nada tan conveniente. Esta es una versión un poco más elegante del enlace incorporado deM-q topush-line .)

Esto no ejecuta un subshell: el comando que escribe después de "suspender" el anterior se ejecuta en el mismo shell. Esto le permite hacer cosas como cambiar el directorio actual si se da cuenta después de escribir un comando que pretendía ejecutarlo en un directorio diferente. Si desea ejecutar una nueva instancia de shell, puede ejecutar zshdesde un enlace de teclas, pero no creo que sea particularmente útil.

Gilles 'SO- deja de ser malvado'
fuente