scripts script programas programar programacion español ejemplos comandos bash command-line keyboard-shortcuts input-history

bash - programas - shell script



¿Cómo usar argumentos del comando anterior? (9)

Sé que Esc + . Te da el último argumento del último comando.

Pero me interesa el primer argumento del último comando. ¿Hay un enlace clave para hacerlo?

En las mismas líneas, ¿existe una forma genérica de obtener el enésimo argumento del último comando? Sé que en un script de bash, puedes usar $0 , $1 , etc., pero estos no funcionan en la línea de comandos.

Además, ¿qué pasa con la iteración a través del 0º argumento de los comandos anteriores, como podemos hacer con el último argumento presionando continuamente Esc + . ?


! ^ puede ser el comando para el primer argumento. No estoy seguro de si hay una manera de obtener el nth.


! ^ te dará el primer parámetro,! $ te conseguirá el último parámetro,!: n te dará el elemento nth.


¡También puedes obtener argumentos de cualquier comando en tu historial!

$ echo a b c d e f g a b c d e f g $ echo build/libs/jenkins-utils-all-0.1.jar build/libs/jenkins-utils-all-0.1.jar $ history | tail -5 601 echo build/libs/jenkins-utils-all-0.1.jar 602 history | tail -10 603 echo a b c d e f g 604 echo build/libs/jenkins-utils-all-0.1.jar 605 history | tail -5 $ echo !-3:4 echo d d $ echo !604:1 echo build/libs/jenkins-utils-all-0.1.jar build/libs/jenkins-utils-all-0.1.jar


Así como M-. (meta-punto o esc-dot o alt-dot) es la función de yank-last-arg MCy yank-last-arg , MCy (meta-control-y o esc-ctrl-y o ctrl-alt-y) es la función de readline yank-nth-arg Sin especificar n , tira el primer argumento del comando anterior.

Para especificar un argumento, presione Escape y un número o mantenga presionada la tecla Alt y presione un número. Puede hacer Alt - - para comenzar a especificar un número negativo, luego suelte Alt y presione el dígito (esto contará desde el final de la lista de argumentos).

Ejemplo:

Ingrese el siguiente comando

$ echo a b c d e f g a b c d e f g

Ahora en el siguiente indicador, escriba echo (con un espacio siguiente), luego

Presiona Alt - Ctrl - y y ahora verás:

$ echo a

sin pulsar Intro todavía, haga lo siguiente

Presione Alt - 3 Alt - Ctrl - y

Presione Alt - - 2 Alt - Ctrl - y

Ahora verás:

$ echo ace

Por cierto, podrías haber puesto el echo en la línea seleccionando el argumento 0:

Presione Alt - 0 Alt - Ctrl - y

Editar:

Para responder a la pregunta que agregó a su original:

Puede presionar Alt - 0 y luego presionar Alt - repetidamente . para pasar a través de los comandos anteriores (arg 0). Similarmente Alt - - luego repitiendo Alt - . le permitiría pasar a través de los anteriores argumentos de último a último.

Si no hay un argumento apropiado en una línea particular en el historial, la campana sonará.

Si hay una combinación particular que usa con frecuencia, puede definir una macro para que una pulsación de tecla la ejecute. Este ejemplo recuperará el segundo argumento de los comandos anteriores presionando Alt - Mayúsculas - Y. Puede elegir cualquier pulsación de tecla disponible que prefiera en lugar de esta. Puede presionarlo repetidamente para pasar por los anteriores.

Para probarlo, ingrese la macro en un indicador de Bash:

bind ''"/eY": "/e2/e."''

Para hacerlo persistente, agregue esta línea a su archivo ~/.inputrc :

"/eY": "/e2/e."

Desafortunadamente, esto no parece funcionar para arg 0 o números de argumento negativos.


Básicamente tiene un uso en el rechazo de argumentos anteriores (comandos).

Por ejemplo, si se emite el siguiente comando:

echo Hello, world how are you today?

entonces, Hello, será el primer argumento, y today? el sexto , que es el último; lo que significa que se puede hacer referencia escribiendo:

Alt + 6 seguido de Ctrl-Alt-6

Ctrl se denota tradicionalmente como un carácter de sombrero ^ precedido de los nombres de las teclas, y Alt como M- que es el prefijo M eta.

Por lo tanto, el atajo de arriba se puede redefinir como ^My para tirar.

Además, hay atajos de sustitución de sombreros en la línea de comando:

echo Hello, world! ^Hello^Bye Bye, world!

para sustituir la primera cadena coincidente del comando anterior, lo que significa:

Hello, world! Hello, people! ^Hello^Bye

daría lugar a:

Bye, world! Hello, people!

dejando el segundo partido ( hello ) sin cambios.

Nota: No deje espacio entre los sombreros , o la operación no funcionará.

Lo anterior es solo un atajo para:

!:s/Hello/Bye

la sustitución de nivel de evento (*) para la primera cadena encontrada (coincidente) en el comando anterior, mientras que el prefijo de la primera parte con el interruptor g se aplicará a toda la línea g lobular:

echo Hello, world! Hello, people! !:gs/Hello/Bye Bye, world! Bye, people!

como suele hacerse en otros comandos relacionados, como sed , vi y en expresiones regulares (expresión regular), una forma estándar de búsqueda ( cadena de coincidencia ).

No, no puedes hacer !:sg/Hello/Bye o !:s/Hello/Bye/g aquí, ¡esa es la sintaxis !

  • ! es para eventos; evento puede entenderse como salida de comando u operación realizada en el historial de comandos.

Eso es lo que entendí al usarlo yo mismo y probar cosas por mi cuenta a partir de lo que leo de varias fuentes, incluidas páginas de manuales, blogs y foros.

Espero que arroje algo de luz sobre formas misteriosas de bash , el shell Bourne-Again (un juego en el shell sh , que a su vez se llama shell Bourne después del apellido de su inventor), lo que es el shell predeterminado en muchas distribuciones, incluidos los servidores ( sistema operativo del servidor ) .


El método descrito al final de la respuesta aceptada también funciona con el argumento cero para mí. Tengo estas líneas en mi ~/.inputrc :

"/en": "/e0/e." "/em": "/e1/e." "/e,": "/e2/e."

/e2/e. tiene la ventaja sobre /e2/e/Cy que pasa por los comandos anteriores si se presiona repetidamente en lugar de insertar el segundo argumento del comando anterior varias veces.

Para insertar todo el comando anterior, puede escribir !!/e^ . /e^ es history-expand-line .


Me gustó la respuesta de @larsmans y tuve que aprender más. Agregando esta respuesta para ayudar a otros a encontrar la sección de la página de manual y saber qué buscar en Google:

$ man -P ''less -p ^HISTORY/ EXPANSION'' bash <...> Word Designators Word designators are used to select desired words from the event. A : separates the event specification from the word designator. It may be omitted if the word designator begins with a ^, $, *, -, or %. Words are numbered from the beginning of the line, with the first word being denoted by 0 (zero). Words are inserted into the current line separated by single spaces. 0 (zero) The zeroth word. For the shell, this is the command word. n The nth word. ^ The first argument. That is, word 1. $ The last argument. % The word matched by the most recent ‘?string?’ search. x-y A range of words; ‘-y’ abbreviates ‘0-y’. * All of the words but the zeroth. This is a synonym for ‘1-$’. It is not an error to use * if there is just one word in the event; the empty string is returned in that case. x* Abbreviates x-$. x- Abbreviates x-$ like x*, but omits the last word. If a word designator is supplied without an event specification, the previous command is used as the event.


Para usar el primer argumento, puede usar !^ O !:1

Ejemplo:

$ echo a b c d e a b c d e $ echo !^ echo a a $ echo a b c d e a b c d e $ echo !:1 echo a a

Ya que tu pregunta es sobre el uso de otros argumentos, aquí hay algunos útiles:

!^ first argument !$ last argument !* all arguments !:2 second argument !:2-3 second to third arguments !:2-$ second to last arguments !:2* second to last arguments !:2- second to next to last arguments !:0 the command !! repeat the previous line

Las primeras cuatro formas son las más utilizadas. El formulario !:2- es algo contraintuitivo, ya que no incluye el último argumento.


!$ obtiene el último elemento del argumento de línea de comando anterior.