desarrollo-web-br-bd.com

¿Hay alguna manera de guardar un comando en el terminal de Ubuntu si no lo he ingresado?

Me preguntaba si había una forma rápida de guardar un comando en el terminal de Ubuntu. El escenario es:

Problema:

  1. Escribí un [comando largo]
  2. Olvidé que necesitaba ejecutar [otro comando] antes de poder ejecutar el [comando largo]

Quiero poder guardar el comando para su uso posterior de una manera fácil que no sea simplemente poner un # antes y ponerlo en el historial de teclas arriba y abajo. Guardarlo de manera óptima directamente en un registro o en el portapapeles.

Olvidé mencionar que tampoco quería hacer eco.

45
duckingChickens

Este no es su terminal, este es su Shell.

El nombre del mecanismo de Shell que está buscando es kill buffer. La gente olvida que los editores de línea de comandos de Shell tienen estos. ZLE en Z Shell los tiene, como han GNU Readline en Bourne Again Shell, libedit en (FreeBSD) Almquist Shell, el editor de línea de Korn Shell y el editor de línea de TENEX C Shell.

En todos estos shells en modo emacs, simplemente vaya al final de la línea para guardarlo, elimínelo en el buffer de eliminación de cabeza con ⎈ Control+U, escribe y ejecuta el comando intermedio, y luego tira del contenido del búfer kill con ⎈ Control+Y. Asegúrese de no hacer nada con el búfer kill al ingresar el comando intermedio.

En el Shell Z en modo vi, tiene las secuencias de prefijo vi para especificar un búfer de estilo vi- para matar la línea. Puede usar uno de los otros búferes en lugar del búfer predeterminado. Simplemente usa algo como "add (en el modo vicmd) para eliminar toda la línea en el búfer "a", escriba y ejecute el comando intermedio y luego coloque el contenido del búfer con "ap.

En sus modos vi, Korn Shell, GNU Readline en Bourne Again Shell y libedit en (FreeBSD) Almquist Shell no han nombrado vi estilo búfer, solo el búfer de corte. dd para eliminar la línea en ese búfer, seguido de poner el contenido del búfer con p, trabajará. Pero usa el mismo búfer de estilo vi- que matar y tirar al ingresar el comando intermedio.

52
JdeBP

No desea anteponer echo (o cualquier otro comando no-op-type) a su línea, ya que puede tener redirección de E/S, y aún se ejecutarán, posiblemente sobrescribiendo cualquier archivo que pueda aún necesita acceder (hasta que esté listo para ejecutar su comando).

En su lugar, vaya al comienzo de la línea e ingrese el carácter de comentario, #. Entonces puedes presionar Enter, y la línea se guardará en su historial.

Si está en modo vi, ksh y bash (al menos) tienen un comando específico para esto: ingrese al modo de comando (presione Esc) luego presione el # personaje.

Esto es específicamente para este caso de uso. La descripción de este comando en el libro O'Reilly Learning the Korn Shell dice:

Anteponga # (carácter de comentario) a la línea y envíelo al archivo de historial; útil para guardar un comando que se ejecutará más tarde sin tener que volver a escribirlo. Si la línea ya comienza con un #, elimine el # inicial y cualquier otro carácter de comentario que siga a las nuevas líneas en un comando multilínea.

31
user7761803

Si está ejecutando zsh, puede usar Ctrl-Q, que ejecuta el comando Push-line . Guardará lo que ha escrito actualmente en una pila, borrará el mensaje y luego desplegará la pila después de ingresar su próximo comando. Lo uso todo el tiempo exactamente para la situación que usted describe.

16
0x5453

Por lo general, solo agrego "'" (comilla simple) al final de la línea y presiono Enter y Ctrl-C. Más tarde lo recuerdo con el cursor hacia arriba o Ctrl-R. Sin embargo, debe asegurarse de que no haya citas extraviadas anteriormente.

6
Edheldil

Si su Shell está configurado en modo emacs (valor predeterminado habitual para bash, creo):

#set -o | grep emacs
emacs         on

entonces tú puedes:

<Ctrl>a or <arrowkeys> # to go to the beginning of the current line or to wherever you want
<Ctrl>k    # to "kill" the content from the cursor position to the end of the line + SAVE it
... here you type the command you forgot to add ...
<Ctrl>y    # to "yank" the SAVED line into the current editing line. or <Ctrl>p in ksh(??)
<Enter>    # to execute it

#note: you can also replace: <Ctrl>a<Ctrl>k with: <Ctrl>u # kills the whole line + SAVE it

Esto es muy rápido y se convierte en un hábito. ctrl-k también puede ser útil para guardar solo el "final" de una línea (por ejemplo: 2 argumentos largos que sabe que volverá a usar más tarde, que "matará" (+ guardar), y que luego podrá "tirar" volver tan a menudo como quieras)

Si su Shell está en modo vi, puede usar los comandos vim habituales:

<Esc>      # to go back to normal(command) mode, if you were in editing mode
dd         # to delete the whole current line + SAVE it  (see note below)
i          # to reenter editing mode
... here you type the command(s) you forgot ...
<Esc>      # to return to normal mode
p          # to paste the buffered line + place the cursor on top of the last character
a          # to reenter editing mode past that current character
<Enter>    # to execute it

# note: instead of "dd" (kill whole line) you can simulate emacs <Ctrl>a<Ctrl>k with:
#    | or h or l  # to go to the 1st char of the line or wherever # simulates <Ctrl>a or <arrow keys>
#    d$  # to delete from the current position to the end of the line + SAVE it # <Ctrl>k
4
Olivier Dulac

Solución alternativa que podría funcionar según el caso.

really long command thigng -flag -flag2

Presione inicio, ingrese el nuevo comando y luego && para ejecutar primero, y si tiene éxito, ejecute segundo.

first command && really long command thigng -flag -flag2

Sin embargo, nunca se guardará como pasos separados.

Alternativamente:

Si ya ingresó el primer comando (como se presionó enter) puede escribir first_command && !! que insertará el segundo comando en !!

4
Viktor Mellgren

Puede seleccionar/copiar el texto con la GUI o las funciones de Shell, y luego pegarlo en algún archivo o simplemente no olvidar no sobrescribirlo con una selección posterior (para que pueda pegarlo de nuevo cuando sea necesario), pero me parece incómodo: el lugar de las líneas de comando completas es en mi humilde opinión en el "historial de teclas arriba y abajo".

En lugar de agregar un # Al comienzo de la línea y presionar <Enter>, Puede crear una combinación de teclas que guarde la línea de comando actual en el historial sin ejecutarla.

P.ej. con bash, vinculándolo a Meta/Alt-C o Esc-C (generalmente vinculado a capitalize-Word en las combinaciones de teclas de emacs; use otra tecla si ya lo está usando):

bind -x '"\ec": history -s "$READLINE_LINE"; READLINE_LINE='

Si está utilizando las combinaciones de teclas vi, puede poner en cuclillas el ^G Sin usar:

bind -x '"\C-g": history -s "$READLINE_LINE"; READLINE_LINE='

Eso también despejaría la línea después; si no desea eso (y prefiere cancelar manualmente la línea con, por ejemplo, ^C), omita el READLINE_LINE=.

3
mosvy

En lugar de tratar con varios atajos de teclado de línea de lectura posiblemente esotéricos, puede editar el archivo de historial de su Shell directamente. Con bash:

  1. history -w (Vaciar el historial existente)
  2. $EDITOR $HISTFILE (Edite su archivo de historial (~/.bash_history por defecto) y realice los cambios que desee)
  3. history -c ; history -r (Borre el historial en memoria de su Shell y vuelva a cargarlo desde el archivo de historial)

Como me gusta hacer muchos ajustes en mi historial de bash, escribí una función de bash para que sea más conveniente:

histedit()
{
  # Flush history.
  history -w

  # Open an editor at the last line.  Pipe the file into `wc` to suppress
  # printing the filename.
  #
  # Note that some versions of `wc` (e.g. BSD) do not support long options
  # and print with leading spaces.
  last_line=$(wc -l < "${HISTFILE}")
  last_line=$(( "${last_line}" ))

  "${EDITOR}" "+${last_line}" "${HISTFILE}"

  # Reload the history file.
  history -c
  history -r
}

También tengo na función bash separada para realizar una búsqueda rápida y reemplazar en mi historial bash para corregir y volver a ejecutar comandos escritos.

2
jamesdlin

Si ya ha escrito el segundo comando, vaya al comienzo de la línea, escriba el primer comando y luego un punto y coma para separar los dos. Esto es si el éxito no importa. Si importa, el && alguien más sugirió.

2
WGroleau

No, no se guardará en el historial de la línea de comandos porque solo toma los comandos que se han ingresado.

Sin embargo, puede anteponer "echo" para guardar algo que fue complicado de escribir

echo /usr/bin/complicate -v e -r y -c o -m p -l ic -a t -t ed

Luego recupere el comando echo y edite para eliminar "echo".

Si necesita algo en el historial como preparación para más adelante, también puede editar el archivo del historial, p. ~/.bash_history para la fiesta o ~/.history para tcsh. Edite cambiando un comando existente, eso es más fácil porque no necesita intentar adivinar la sintaxis del archivo. La próxima vez que se inicie el Shell se leerá (si el Shell está configurado para guardar y leer el historial, lo que ocurre de manera predeterminada en la mayoría de los sistemas).

Una tercera forma de usar un comando complicado sin escribir mucho sería definir un alias para el comando. Nuevamente, la sintaxis varía según la variante de Shell:

intento:

alias ll='ls -algF --color=auto'

tcsh:

alias ll 'ls -algF --color=auto'

El nuevo comando ll hará lo mismo que ingresar ls -algF --color=auto. Puede ver los alias existentes (por ejemplo) simplemente ejecutando alias sin parámetros.

Estas líneas se pueden ingresar en ~/.bashrc y ~/.tcshrc, respectivamente, para guardarlos para todas las nuevas startups de Shell.

1
Ned64