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,
!#:npor ejemplo,fuente
GNU bash, version 4.3.48(1)-releasetouch 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
Alty presione2.(oEsc,2,Esc,.), para obtener el segundo al último argumento de prensaAlt+-, el tipo2y pulseAlt+.(oEsc,-2,Esc,.).echo 1 2 3 4entonces quiero2y3para el próximo comandoAlty el tipo2., presione la barra espaciadora, bodegaAlty tipo3.- si quieres un rango, el uso de expansión de historia:!!:2-3.En lo que respecta al shell interactivo predeterminado
bashy 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
objectAa 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!#:ncomo 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,!#:nque 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 queechoune sus argumentos con un solo espacio). Pero, por ejemplotouch "hello there"; ls -l $_, no funcionará.$_es que es portátil. Después de todo,!#:nes 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.txtlugar 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 cmdsolo la establece como una variable de entorno para ese comando, y no afecta el contexto de shell.fuente