![](/img/trans.png)
[英]How to pass in shell scripts mandatory and optional flags in command line using getopts?
[英]How to pass make flags stored in text files in command line?
我有一个名为OPTIONS.txt的文本文件,该文件存储Makefile的所有标志:
arg1=foo arg2="-foo -bar"
我想通过所有标志在这个文件中make
。 然而,
make `cat OPTIONS.txt`
使用make: invalid option -- 'a'
失败。 似乎shell将其解释为:
make arg1=foo arg2="-foo -bar"
^argv[1] ^argv[2] ^argv[3]
有什么办法可以将其解释为:
make arg1=foo arg2="-foo -bar"
^argv[1] ^--------argv[2]
如果要让shell在反引号扩展后解释引号,则需要使用eval,如下所示:
eval make `cat OPTIONS.txt`
但是请注意,这会评估所有内容,因此,如果您引用了引号之外的内容,则会遇到相同的问题:
eval make `cat OPTIONS.txt` arg4="one two"
将给出一个错误。 您必须将arg4
双引号,如下所示:
eval make `cat OPTIONS.txt` arg4='"one two"'
通常,在脚本之外从命令行执行此类操作比较棘手。
预计到达时间
真正的问题是我们没有一套要求。 为什么要将它们放入文件中,以及要添加什么内容? 它们是仅makefile变量赋值,还是这里还有其他make选项,例如-k
或类似的?
如果OP控件(可以更改)文件的格式并且文件包含仅由make使用的内容,并且OP不在乎变量是命令行分配还是常规分配,并且仅存在变量分配而没有其他选项,那么他们可以(a)将每个变量赋值放在自己的行上,(b)删除所有引号,并且(c)从makefile内部使用include OPTIONS.txt
来“导入”它们。
由于您控制选项文件,因此每行存储一个选项:
arg1=foo
arg2="-foo -bar"
然后在外壳中,将文件读入数组,每行一个元素:
readarray -t opts < OPTIONS.txt
现在,您可以调用make并使整个选项保持不变:
make "${opts[@]}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.