【问题标题】:Makefile passing variables to bash scriptMakefile 将变量传递给 bash 脚本
【发布时间】:2018-03-02 02:51:08
【问题描述】:

我想从 Makefile 将空格分隔的带引号的子字符串传递给 make 目标(实际上是几个不同的 make 目标)。目标只是执行一个 bash 脚本,然后将每个引用的子字符串作为位置参数传递给另一个脚本。

测试Makefile:

FOO="foo bar"
FOO+="bar baz"
FOO+="baz qux"
FOO+="qux"
export FOO

t:
    ./script.sh

这里是script.sh:

#! /bin/bash
set -ex

./thing.sh "$FOO"

这不起作用;输出(注意周围的单引号)是:

???? ~/c/scrap
(i) make t
./script.sh
+ ./thing.sh '"foo bar" "bar baz" "baz qux" "qux"'

需要明确的是,我希望将多个参数传递给thing.sh,而不是单个参数,并且我需要引用每个参数,因为它可能包含空格或特殊字符。

???? ~/c/scrap
(i) make t
./script.sh
+ ./thing.sh "foo bar" "bar baz" "baz qux" "qux"

完成此任务的最佳方法是什么?理想情况下,我们会在 Makefile 中解决这个问题,以避免在每个消耗 FOO 的目标中重复解决方案。

【问题讨论】:

  • 我没有意识到你需要保留双引号。
  • 双引号中的“单词”是否包含空格或其他特殊字符?你确定script.sh(和thing.sh)需要引号,或者你只是想让它像你在控制台上键入它一样运行,每个单词都有引号。区别在于script.sh 中$1 的值应该是"foo" 还是只是foo?
  • 是的,它们包含空格,因此需要引用;抱歉,我在最初的示例中没有澄清这一点。 (尽管在我提出的解决方案中对此进行了澄清。)我将编辑问题以更准确地反映要求。

标签: bash makefile


【解决方案1】:

这是解决 Makefile 级别问题的一种方法:

FOO="foo bar"
FOO+="bar baz"
FOO+="baz qux"
FOO+="qux"
export FOO

t:
    eval './script.sh $(FOO)'

这里是script.sh。

#! /bin/bash
set -ex

./thing.sh "$@"

这里是thing.sh。

#! /bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"

输出:

? ~/c/scrap
(i) make t
eval './script.sh "foo bar" "bar baz" "baz qux" "qux"'
+ ./thing.sh 'foo bar' 'bar baz' 'baz qux' qux
foo bar
bar baz
baz qux
qux

【讨论】:

  • eval 的意义何在? ./script.sh $(FOO) 会做同样的事情。
  • 我相信eval 的意义在于将许多参数传递给script.sh 而不是单个字符串。
  • 没有区别。 eval 'whatever' 和 whatever 做同样的事情。这就是eval 的定义:它执行它的参数就好像它是一个shell 命令。
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2020-05-20
相关资源
最近更新 更多