Если вы хотите сделать это надежным способом, который работает для каждого возможного аргумента командной строки (значения с пробелами, значения с символами новой строки, значения с буквенными символами кавычек, непечатные значения, значения с символами глобуса и т. Д.), Онстановится немного интереснее.
Для записи в файл, заданный массив аргументов:
printf '%s\0' "${arguments[@]}" >file
... заменить на "argument one"
, "argument two"
и т. д.* при необходимости.
Для чтения из этого файла и использования его содержимого (в bash, ksh93 или другой недавней оболочке с массивами):
declare -a args=()
while IFS='' read -r -d '' item; do
args+=( "$item" )
done <file
run_your_command "${args[@]}"
Для чтенияиз этого файла и использовать его содержимое (в оболочке без массивов; обратите внимание, что это перезапишет ваш локальный список аргументов командной строки, и, следовательно, лучше всего это сделать внутри функции, так что вы перезаписываете аргументы функции, а не глобальныеlist):
set --
while IFS='' read -r -d '' item; do
set -- "$@" "$item"
done <file
run_your_command "$@"
Обратите внимание, что -d
(допускающий использование другого разделителя конца строки) является расширением, отличным от POSIX, и оболочка без массивов может также не поддерживать его.В этом случае вам может понадобиться использовать язык без оболочки для преобразования содержимого, разделенного NUL, в eval
-безопасную форму:
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 "$@"