gmake文件中的内部shell命令导致' HERE'要退出的文档shell脚本

时间:2016-03-09 16:18:55

标签: shell makefile ibm-midrange

给出这个简单的gmake makefile,标题为makefile.weird:

symlinks : 
    @ln -s realfile.txt linkfile.txt

这个shell脚本:

ksh -s << EOF
date
gmake -f makefile.weird symlinks
date
echo "This should print some stuff"
EOF

只有第一个&#39;日期&#39;命令打印。 ln命令由gmake运行,但是shell脚本只是在调用gmake后结束,实际上忽略了&#34; here&#34;脚本的文档部分。我以前从未见过这个。任何人都有解释和可能的解决方法?我可以从makefile中删除命令,但是我的好奇心让我紧紧抓住了这个命令。这不重要,但这发生在运行ksh93的AS / 400上,通过他们的PASE系统(在IBMi上运行AIX的方式)。

2 个答案:

答案 0 :(得分:2)

gmake继承了ksh的标准输入,其标准输入是此处的文档,因此gmake(或由gmake调用的内容)正在消耗剩下的用于ksh的输入。

shell脚本应该只是像

#!/bin/ksh
date
gmake -f makefile.weird symlinks
date
echo "This should print some stuff"

避免了所有内容共享标准输入的问题。

答案 1 :(得分:0)

通过黑客攻击脚本(这是我需要通过'here'文档工作的原因),我提出了两种可能的解决方案:

将gmake扔到后台并在其上调用“wait”

ksh -s << EOF
date
gmake -f makefile.weird symlinks &
wait
date
echo "This should print some stuff"
EOF

将“&lt; / dev / null”添加到gmake命令的末尾。如果您的gmake不需要stdin输入,则此方法有效。

ksh -s << EOF
date
gmake -f makefile.weird symlinks < /dev/null
date
echo "This should print some stuff"
EOF