1

我见过一些 shell 脚本,它们通过在同一个 shell 脚本中写入文件的内容来传递文件。例如:

if [[ $uponly -eq 1 ]]; then
    mysql $tabular -h database1 -u usertrack -pabulafia usertrack << END                                                                                           

    select host from host_status where host like 'ld%' and status = 'up';                                                                                          

END
     exit 0
fi

我已经能够做类似的事情:

python << END
print 'hello world'
END

如果说脚本的名称,myscript.sh那么我可以通过执行来运行它sh myscript.sh。我得到了我想要的输出。

问题是,我们可以在 Makefile 中做类似的事情吗?我一直在环顾四周,他们都说我做了类似的事情:

target:
        python @<<
print 'hello world'
<<

但这不起作用。

以下是我一直在寻找的链接:

http://www.opussoftware.com/tutorial/TutMakefile.htm#Response%20Files

http://www.scribd.com/doc/2369245/Makefile-Memo

4

2 回答 2

4

你可以这样做:

define TMP_PYTHON_PROG
print 'hello'
print 'world'
endef

export TMP_PYTHON_PROG
target:
    @python -c "$$TMP_PYTHON_PROG"

首先,您使用defineand定义一个多行变量endef。然后你需要把export它放到 shell 中,否则它会将每个新行视为一个新命令。然后使用 .重新插入 shell 变量$$

于 2012-06-21T00:45:33.807 回答
3

@<<的事情不起作用的原因是它似乎是非标准制作变体的功能。同样,definemVChr 提到的命令是特定于 GNU Make 的(据我所知)。虽然 GNU Make 分布非常广泛,但这个技巧在 BSD make 和 POSIX-only make 中都行不通。

作为一般原则,我觉得尽可能保持 makefile 的可移植性是很好的;如果您在自动配置系统的上下文中编写 Makefile,它仍然更重要。

一种完全可移植的技术来做你正在寻找的事情是:

target:
    { echo "print 'First line'"; echo "print 'second'"; } | python

或者等价地,如果你想把事情整理得更整齐一点:

target:
    { echo "print 'First line'"; \
      echo "print 'second'"; \
    } | python
于 2012-06-21T12:35:03.323 回答