Sé que, teniendo en cuenta l="a b c",
echo $l | xargs ls
rendimientos
ls a b c
¿Qué construcción produce
mycommand -f a -f b -f c
fuente
Sé que, teniendo en cuenta l="a b c",
echo $l | xargs ls
rendimientos
ls a b c
¿Qué construcción produce
mycommand -f a -f b -f c
Una forma de hacerlo:
echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand
Esto supone a, by cno contiene espacios en blanco, nuevas líneas, comillas o barras diagonales inversas. :)
Con GNU findutilpuedes manejar el caso general, pero es un poco más complicado:
echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand
Puede sustituir el |separador con algún otro carácter, que no aparece en a, bo c.
Editar: como señala @MichaelMol , con una lista muy larga de argumentos existe el riesgo de desbordar la longitud máxima de argumentos a los que se puede pasar mycommand. Cuando eso sucede, el último xargsdividirá la lista y ejecutará otra copia de mycommand, y existe el riesgo de que deje un no terminado -f. Si te preocupa esa situación, puedes reemplazar el último xargs -0anterior por algo como esto:
... | xargs -x -0 mycommand
Esto no resolverá el problema, pero abortará la ejecución mycommandcuando la lista de argumentos sea demasiado larga.
ARG_MAXy tener un-fparámetro separado de su par.mycommand. Siempre puedes agregar-xal últimoxargs.xargsen absoluto, y solo usarlafindsi puede usarse. Esta solución es peligrosa; al menos debe advertir el caso de falla en su respuesta.findsería una mejor solución general, particularmente cuando los argumentos iniciales no son nombres de archivo. :)-f, y con una herramienta de ejemplolsutilizada para ilustración, @ not-a-user está tratando con nombres de archivos. Y dadofindofrece el-execargumento, que le permite construir una línea de comandos, está bien. (Siempre y cuandomycommandse permita ejecutar más de una vez. Si no es así, entonces tenemos otro problema con el uso dexargsaquí ...)Una mejor manera de abordarlo (IMO) sería:
en
zsh:o usando la compresión de la matriz para que el argumento no se adjunte a la opción:
De esa manera, todavía funciona si la
lmatriz contiene elementos vacíos o elementos que contienen espacios o cualquier otro carácter problemático paraxargs. Ejemplo:en
rc:en
fish:(AFAIK,
rcyfishno tiene compresión de matriz)Con conchas de estilo Bourne de estilo antiguo como
bash, siempre puedes hacer (aún permitiendo cualquier carácter en los elementos de la$@matriz):fuente
for i; do args+=('-f' "$i");done;mycommand "${args[@]}". IDK si esto es más rápido, pero agregar 2 elementos a una matriz parece que debería ser O (n), mientras que susetciclo probablemente copia y vuelve a analizar la lista de argumentos acumulados cada vez (O (n ^ 2)).