Volver a ejecutar el mismo comando con un parámetro diferente

13

Sé que puedo ejecutar el siguiente comando

ls Some{File,Folder}

Y es equivalente a ejecutar esto:

ls SomeFile SomeFolder

(También lo uso mucho para cosas como mv place_{a,b})

Sin embargo, me preguntaba si había un acceso directo diferente donde podría hacer algo como esto:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

Y solo tenía que escribir run-command --a --whole --lot --of --flags parameter {a,b}o algo similar.

ashays
fuente
Eso depende de que run-commandmuchos comandos de Unix manejen varios argumentos de archivo en secuencia.
vonbrand

Respuestas:

13

Suponiendo que está utilizando GNU basho algo similar:

Tal vez un forbucle?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

que también se puede escribir en una línea como for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done

njsg
fuente
1
o si tiene mucho que desee ejecutar puede utilizar la expansión fiesta como talfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller
Lo que va allí puede ser una lista separada por espacios generada de muchas maneras. Así que sí, {a..z}, *.pdf, $(find ...)...
njsg
No sé por qué mi mente no saltó a lazos. ¡Gracias! Esto probablemente será lo que yo uso. La idea de la función es buena, pero me gusta más.
ashays
1
El one-liner solo funcionó para mí después de eliminar la ;siguiente dopalabra clave.
jimp
@jimp Gracias, he cambiado el código para eliminar eso ;.
njsg
5

Si no está escribiendo este script y solo quiere ejecutarlo fácilmente en una línea de comando, el xargscomando es probablemente lo que está buscando.

xargs tomará un montón de contenido de la entrada estándar y lo usará como argumentos para un comando, ejecutando ese comando varias veces si es necesario.

Intenta lo siguiente:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

En este ejemplo, simplemente le está dando a xargs las permutaciones que desea que se ejecuten.

El indicador "-n 1" para indicarle a xargs que use solo 1 de los argumentos por ejecución.

El indicador "-d" le dice a xargs que busque un "," en la entrada como el deliminador entre los argumentos a ejecutar. (Tenga en cuenta que si el argumento tiene un "," deberá cambiar esto a otra cosa. Si sus argumentos no tienen espacios, puede omitir esta marca por completo).

Ver man xargspara más información.

Hobadee
fuente
4

También puede usar una función, que no lo limita a tener su argumento cambiante al final:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b
Chris Down
fuente
2

Puede realizar sustituciones en el comando anterior. Esto no funcionará con su ejemplo {a, b}, porque todas las instancias de 'a' serán reemplazadas por una 'b'. Pero imagina que quieres ejecutar los siguientes comandos:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

Puedes hacerlo con

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Bash hará la sustitución y correrá

run-command --a --whole --lot --of --parameter --format json

Use gs (sustitución global) para realizar varias sustituciones, no solo una.

philant
fuente
1

Hay un aliascomando en bash:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

El uso es: $ shotcommand a

dchirikov
fuente
También hay funciones, si el código es un poco más complejo :-)
njsg
2
Esta solución solo funciona si mi parámetro cambiante es el último, ¿correcto?
ashays
Si. Tienes razón.
dchirikov