¿Cómo puedo obtener un argumento específico de un comando anterior en bash?

31

En bash, puede usar !*para obtener todos los argumentos del comando anterior. Como ejemplo, si lo hiciste cp /some/path /some/other/pathy luego lo hiciste mv !*, el segundo comando se expandiría a mv /some/path /some/other/path.

¿Hay algo como esto que pueda usarse para acceder a un argumento específico desde un comando en lugar de todos ellos?

Wuffers
fuente

Respuestas:

38

En !*, !es el prefijo de expansión del historial , y *es la palabra designadora que significa todos los argumentos. Puede memorizar la sintaxis general como bang-line-colon-column ( columna de !línea :). Hay muchos atajos posibles: la línea predeterminada es la línea anterior, el especificador de columna predeterminado es "todos", y puede dejar los dos puntos si el especificador de columna no es numérico (pero !3significaría la línea 3). Se puede utilizar !:0para hacer referencia al nombre del comando, !:1, !:2, etc, para referirse a los argumentos sucesivos, !:$para la última palabra, !:*para todos los argumentos, y mucho más.

Vea también esta publicación de Michael Mrozek en Unix Stack Exchange .

Gilles 'SO- deja de ser malvado'
fuente
1
Lo intenté yo mismo y esto no funcionó, sin embargo. Después de ver el mensaje por Michale Mrozek, lo dice a su uso !:1, !:2. Después de usar la versión con los dos puntos, funcionó.
Wuffers
@MrMan: Vaya, correcto, si dejas los dos puntos con un número, el número se interpreta como un número de línea. Lo siento por eso.
Gilles 'SO- deja de ser malvado'
No hay problema. Entonces, ¿supongo que hacer !1:1apuntaría al primer argumento de la primera línea?
Wuffers
4

Personalmente, realmente no me gusta esta característica de "expansión con signo de exclamación" que incluso molestará si lo intentas echo "Hello World!"en shells interactivos (por lo que los scripts de aprovisionamiento que asumen que se ejecutarán en modo no interactivo no funcionarán en absoluto).

Entonces, configuro set +o histexpandy comienzo a recordar argumentos con el siguiente método:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Tenga en cuenta que el truco de Esc es porque no tengo una meta clave.

Benoit
fuente
Casi nunca uso signos de exclamación en los comandos. Entonces, el método del signo de exclamación funciona perfectamente para mí.
Wuffers
Entonces disfrútalo. Muchas de las numerosas características de su shell están diseñadas para solo unos pocos usuarios.
Benoit
En realidad, no tienes que escapar de los signos de exclamación. Hacer echo 'Hello, orld!'. Tenga en cuenta las comillas simples en lugar de las dobles.
Wuffers