Me pregunto si es posible realizar acciones en cadena en la terminal de Ubuntu como:
action 1 on objectA . then action 2 on objectA
sin tener que repetir el nombre del objeto A nunca más.
Ejemplo:
touch file.js && openEditor "$1"
o algo así.
command-line
bash
HoCo_
fuente
fuente
&
enviará el comando "táctil" al fondo. Si tenía la intención de "abrir el editor si el toque fue exitoso", entonces quiere en su&&
lugarRespuestas:
Con bash History Expansion , puede referirse a la enésima palabra de la línea de comando actual usando,
!#:n
por ejemplo,fuente
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
personaje introduce una expresión de expansión de historial cuando se encuentra en un shell interactivo : está destinado a la manipulación de la línea de comandos sobre la marcha mientras escribe, y está deshabilitado dentro de scripts no interactivosarg1=file.js; touch "$arg1" && openEditor "$arg1"
Hay un atajo útil para un caso de uso común. En tu ejemplo estás haciendo:
En el segundo comando, el truco es escribir
openEditor
(con un espacio después) seguido de Alt+ .. Esto insertará el último argumento del último comando, que esfile.js
. (Si Altpor alguna razón no funciona , Escdebería funcionar también).Dado que a menudo el "objeto" es el último argumento del comando anterior, esto se puede usar con frecuencia. Es fácil de recordar y se integrará rápidamente en su conjunto de accesos directos de shell utilizados intuitivamente.
Hay muchas cosas que puedes hacer con esto, aquí hay un artículo detallado sobre las posibilidades: /programming/4009412/how-to-use-arguments-from-previous-command .
Como beneficio adicional, esto funcionará no solo en bash sino en todos los programas que usan libreadline para procesar la entrada de la línea de comandos.
fuente
Alt
y presione2.
(oEsc
,2
,Esc
,.
), para obtener el segundo al último argumento de prensaAlt
+-
, el tipo2
y pulseAlt
+.
(oEsc
,-2
,Esc
,.
).echo 1 2 3 4
entonces quiero2
y3
para el próximo comandoAlt
y el tipo2.
, presione la barra espaciadora, bodegaAlt
y tipo3.
- si quieres un rango, el uso de expansión de historia:!!:2-3
.En lo que respecta al shell interactivo predeterminado
bash
y al shell de secuencias de comandosdash
, puede usar$_
para recuperar el último argumento del último comando .csh y tcsh tienen referencias de historial, específicamente para la última palabra del comando, puede usar
!$
, y para argumentos individuales!:<index>
:En general, es mejor asignar lo que sea
objectA
a una variable y usarlo en múltiples comandos, bucles, etc. Alternativamente, una función podría ser una opción:fuente
$_
funciona de manera ligeramente diferente a!#:n
como se expande este último antes de guardar el comando en la historia. Por lo tanto, retroceder en la historia aún mostraría el comando con$_
while,!#:n
que habría sido reemplazado por su valor real. Ambos tienen pros y contras.$_
debe citarse, ya que de lo contrario se divide y se pega como todo lo demás. (Simplemente no lo vemos aquí ya queecho
une sus argumentos con un solo espacio). Pero, por ejemplotouch "hello there"; ls -l $_
, no funcionará.$_
es que es portátil. Después de todo,!#:n
es específico de bash.Recomendaría contra el enfoque de historia dado en la respuesta de steeldriver . Esto depende del estado global, que siempre es frágil.
Lo mejor es realizar un bucle inicial sobre todos los comandos necesarios, utilizando una variabe adecuada:
Lo que es un problema en general es que Bash no aborta cuando hay una falla, es decir, esto en realidad se comporta en
touch foo.txt; gedit foo.txt
lugar de encadenarse&&
. Entonces, para estar seguro, puede agregar unbreak
:fuente
Cuando cocino una línea, a veces asigno mis cosas repetidas a una variable de shell que uso varias veces en el comando. Puedo recuperarlo y editarlo para usar un argumento diferente con flecha hacia arriba, control + a, control + flecha hacia la derecha para acercar el cursor al
t=
.Tenga en cuenta que esto facilita agregar una extensión o una variación en el nombre.
También tenga en cuenta que necesito una
;
asignación posterior a la variable, porquevar=value cmd
solo la establece como una variable de entorno para ese comando, y no afecta el contexto de shell.fuente