gpt4 book ai didi

bash - 来自反引号的多字参数(命令替换)

转载 作者:行者123 更新时间:2023-11-29 09:27:45 25 4
gpt4 key购买 nike

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

--option "option 1" --option "option 2"

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

./myProg $(cat params.txt)

./myProg `cat params.txt`

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

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

作为执行的命令?

最佳答案

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

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

要从脚本中安全地编写一个 eval 安全流,应该如下所示:

printf '%q ' --option "option 1" --option "option 2" >params.txt

明确存储参数并在没有 the serious security risks caused by eval 的情况下使用它们的更好方法, 是一个 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[@]}"

请注意,后一种形式与命令替换不兼容,但可以用于进程替换,如果您正在从比 cat 更有趣的命令中读取输出(最好用简单的重定向代替)。因此:

# 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...)

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

关于bash - 来自反引号的多字参数(命令替换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com