17 votos

¿Cómo ejecuto múltiples comandos usando el mismo argumento?

Me pregunto si es posible hacer acciones de 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í.

30voto

steeldriver Puntos 19092

Con bash History Expansion , puede consultar la enésima palabra de la línea de comando actual usando !#:n ejemplo

 $ touch foobar && ls -l !#:1
touch foobar && ls -l foobar
-rw-rw---- 1 steeldriver steeldriver 0 Jun 20 14:54 foobar

$ touch foo bar && ls -l !#:2
touch foo bar && ls -l bar
-rw-rw-r-- 1 steeldriver steeldriver 12 Jun 20 14:58 bar
 

13voto

Sebastian Stark Puntos 360

Hay un atajo útil para un caso de uso habitual. En el ejemplo que estamos haciendo:

$ touch file.js
$ openEditor <alt>+<.>

En el segundo comando, el truco es escribir openEditor (con un espacio después), seguido por la tecla Alt+.. Se inserta el último argumento de el último comando, file.js. (Si no funciona con la tecla Alt , por alguna razón, Esc debería funcionar así.)

Dado que a menudo el "objeto" es, de hecho, el último argumento del comando anterior, este puede ser utilizado con frecuencia. Es fácil de recordar y que se integren rápidamente en su conjunto de intuitiva de usar el shell de accesos directos.

Hay un montón de cosas que usted puede hacer con esto, he aquí un artículo en profundidad sobre las posibilidades: https://stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command.

Como un bono, esto va a funcionar no sólo en bash, pero en todos los programas que uso libreadline para el procesamiento de entrada de línea de comandos.

9voto

Serg Puntos 17677

Tan lejos como predeterminado shell interactivo bash y de secuencias de comandos de shell dash va, puede utilizar $_ recordar el último argumento de el último comando.

$ echo "Hello World"; echo same "$_"
Hello World
same Hello World

csh y tcsh tienen el historial de referencias, específicamente para la última palabra de comando, puede utilizar !$, y para cada uno de los argumentos - !:<index>:

~% echo foo bar
foo bar
~% echo !$
echo bar
bar

% echo bar baz
bar baz
% echo !:1
echo bar
bar

En general, es mejor asignar lo es objectA a una variable, y utilizar en múltiples comandos, bucles, etc. Alternativamente, la función podría ser una opción:

$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory

3voto

graham Puntos 81

Yo recomendaría en contra de la historia enfoque dado en steeldriver la respuesta. Este se basa en el estado global, que es siempre frágil.

Mejor es por adelantado lazo sobre todos los comandos, mediante una adecuada variabe:

$ for c in touch gedit; do $c foo.txt; done

Lo que es un poco de un problema en general es que Bash no abortar cuando hay una falla, es decir, esta realidad se comporta como touch foo.txt; gedit foo.txt en lugar del encadenamiento con &&. Así que, para estar seguro de que usted puede añadir un break:

$ for c in touch gedit; do $c foo.txt || break; done

1voto

linuxuser27 Puntos 4095

Cuando la cocción hasta un one-liner, a veces me asigne mi repetido cosa a una variable de shell que yo uso varias veces en el comando. Puedo recordar y editarla para usar una diferente arg con una flecha hacia arriba, control+a control+flecha a la derecha para obtener el cursor cerca de la t=.

t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"

Tenga en cuenta que esto hace que sea fácil de añadir una extensión, o una variación en el nombre.

También tenga en cuenta que necesito un ; después de la asignación de variable, debido a que var=value cmd establece que como una variable de entorno para que el comando, y no afecta a la concha de contexto.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: