Bash backtick中的多字参数(命令替换)

Bash backtick中的多字参数(命令替换),bash,shell,Bash,Shell,假设我有一个包含内容的文件params.txt --option "option 1" --option "option 2" 我希望能够使用params.txt的内容作为某些程序的命令行参数,myProg: ./myProg $(cat params.txt) 或 但这似乎不起作用:它将多词参数视为多个参数,而不是单引号参数。有没有一种方法可以使用命令替换(或者我不知道的其他bash特性)从params.txt中提取参数并获取 ./myProg --option "option 1" --

假设我有一个包含内容的文件
params.txt

--option "option 1" --option "option 2"
我希望能够使用
params.txt
的内容作为某些程序的命令行参数,
myProg

./myProg $(cat params.txt)

但这似乎不起作用:它将多词参数视为多个参数,而不是单引号参数。有没有一种方法可以使用命令替换(或者我不知道的其他bash特性)从
params.txt
中提取参数并获取

./myProg --option "option 1" --option "option 2"

由于执行的命令?

如果
params.txt
是由您信任的人编写的,您可以使用
eval
执行此操作:

eval "./myProg $(<params.txt)"

以NUL分隔的流形式存储参数并在不使用参数的情况下使用参数的更好方法是:

# write params file
printf '%s\0' --option "option 1" --option "option 2" >params
…然后,为了消费这些

# read params file into array
params=( )
while IFS= read -r -d '' param; do
  params+=( "$param" )
done <params

# use that array to call your program
./myProg "${params[@]}"

注意,进程替换是POSIX sh中不存在的功能;请确保您的shebang使用此支持指定了一个shell(如
#!/bin/bash
)。

是由人或软件编写的
params.txt
。…如果它来自软件,最好的选择是将其设为NUL分隔,而不是shell-quoted。谢谢。这是一个人写的。如果它是NUL分隔的,有没有一种方法可以在bash中轻松地使用它?编辑:刚刚看到你答案的更新。非常感谢。
# write params file
printf '%s\0' --option "option 1" --option "option 2" >params
# read params file into array
params=( )
while IFS= read -r -d '' param; do
  params+=( "$param" )
done <params

# use that array to call your program
./myProg "${params[@]}"
# this does not work: depends on NULs being stored in a shell variable
while IFS= read -r -d '' param; do params+=( "$param" ); done <<<"$(...command here...)"

# this works
while IFS= read -r -d '' param; do params+=( "$param" ); done < <(...command here...)