我有一个系统,我在其中生成一个makefile,它在Mac OS X下完美运行。当我在Linux下运行它时,我遇到了一个奇怪的问题。我设法将我的makefile简化为一个非常简单的例子:
compile: gcc -o prog *.c &> compile__ chm: chmod u=rwx,g=rwx,o= prog both0: gcc -o prog *.c &> compile__ ; \ chmod u=rwx,g=rwx,o= prog both1: gcc -o prog *.c ; \ chmod u=rwx,g=rwx,o= prog
想法是编译文件然后更改其权限。如果我执行命令序列:
make compile make chm一切正常。但是,如果我执行:
make both0
我收到消息:
chmod: cannot access `prog': No such file or directory
并且权限不会更改。另一方面,如果我执行:
make both1
权限已正确更改。唯一的区别是两个0下的重定向“&> compile__”我删除了两个。
有什么想法吗?
答案 0 :(得分:4)
&> compile__
不是可移植的重定向。在bash中,它重定向标准错误和标准输出,我认为这是你的意图。其他炮弹可能会用它做不同的事情。特别是,破折号背景命令(&
),并重定向标准输出(> compile__
)。 chmod
在编译完成之前执行并创建prog
。重定向标准错误和标准输出可以使用cc -o prog *.c > compile__ 2>&1
进行移植。
(为什么它在mac上运行?可能是另一个以不同方式解释&>
的shell,可能是编译器先前打开文件,可能是竞争条件略有不同。)
答案 1 :(得分:0)
另一种解决方案是为GNU make
指定要使用的 shell 。手册的Section 5.3.1有关于此的信息。例如,以下
export SHELL=`which bash`
在 Makefile 中似乎在Ubuntu / Debian上获得Gnu Make 3.8.1以选择 bash 作为shell。
其他问题是所有shell 内置的的行为存在差异,例如echo
,printf
,test
等。这些问题的深奥选项在基于Debian的系统上make
下运行时,内置的可能会神秘地失败。