Si desea hacer esto de forma robusta, funciona para todos los argumentos de línea de comando posibles (valores con espacios, valores con líneas nuevas, valores con caracteres de comillas, valores no imprimibles, valores con caracteres globales, etc.) se pone un poco más interesante.
escribir en un archivo, teniendo en cuenta una serie de argumentos:
printf '%s\0' "${arguments[@]}" >file
... reemplazar con "argument one"
, "argument two"
, etc., según corresponda.
para leer desde ese archivo y utilizar su contenido (en Bash, ksh93, u otra shell reciente con arrays):
declare -a args=()
while IFS='' read -r -d '' item; do
args+=("$item")
done <file
run_your_command "${args[@]}"
para leer desde ese archivo y utilizar su contenido (en un shell sin matrices, tenga en cuenta que sobrescribirá la lista de argumentos de la línea de comandos local y, por lo tanto, se realiza mejor dentro de una función, de modo que sobrescribe los argumentos de la función y no la lista global):
set --
while IFS='' read -r -d '' item; do
set -- "[email protected]" "$item"
done <file
run_your_command "[email protected]"
Tenga en cuenta que -d
(que permite utilizar un delimitador de final de línea diferente) es una extensión que no es POSIX, y un shell sin matrices tampoco puede admitirlo. Si ese fuera el caso, puede que tenga que utilizar un lenguaje no-shell para transformar el contenido delimitado en NULL en una forma eval
-safe:
quoted_list() {
## Works with either Python 2.x or 3.x
python -c '
import sys, pipes, shlex
quote = pipes.quote if hasattr(pipes, "quote") else shlex.quote
print(" ".join([quote(s) for s in sys.stdin.read().split("\0")][:-1]))
'
}
eval "set -- $(quoted_list <file)"
run_your_command "[email protected]"
"arguments", plural, or "argument", single? La respuesta aceptada es correcta solo en el caso de un solo argumento, que es lo que consulta el texto del cuerpo, pero no en el caso de múltiples argumentos, sobre el cual parece que el tema investiga. –
Las 4 respuestas siguientes generalmente tienen resultados idénticos, pero tienen una semántica ligeramente diferente. Ahora recuerdo por qué dejé de escribir scripts bash: P – Navin