gnumake的奇怪重定向问题

| 我有一个生成文件的系统,该文件在Mac OS X下可以正常运行。在Linux下运行该文件时,会遇到一个奇怪的问题。我设法将我的makefile简化为一个非常简单的示例:     编译:         gcc -o prog * .c&>编译__     chm:         chmod u = rwx,g = rwx,o =编     both0:         gcc -o prog * .c&> compile__; \\         chmod u = rwx,g = rwx,o =编     both1:         gcc -o prog * .c; \\         chmod u = rwx,g = rwx,o =编 想法是编译文件,然后更改其权限。如果我执行命令序列:     进行编译     使chm 一切正常。但是,如果我执行:     两者都做 我收到消息:     chmod:无法访问`prog \':没有这样的文件或目录 并且权限不会更改。另一方面,如果我执行:     使两者都 权限已正确更改。唯一的不同是在both0下的重定向\“&> compile __ \”,我为both1都删除了。 有任何想法吗?     
已邀请:
&> compile__
不是可移植的重定向。在bash中,它同时重定向标准错误和标准输出,我认为这是您的意图。其他外壳可能会对它做不同的事情。特别是,破折号使命令((1)成为背景,并重定向标准输出(
> compile__
)。在编译完成并创建before4 and之前执行
chmod
。可以用port5ѭ进行标准错误和标准输出的重定向。 (为什么它在Mac上不能工作?可能是一个不同的shell,它对ѭ6进行了不同的解释,可能是编译器更早地打开了文件,可能是竞争条件稍有不同。)     
另一种解决方案是指定供GNU
make
使用的外壳。手册第5.3.1节提供了有关此信息。例如,以下
export SHELL=`which bash`
在Makefile中,似乎可以在Ubuntu / Debian上使用Gnu Make 3.8.1选择bash作为外壳。 其他问题是所有内置Shell的行为上的差异,例如
echo
printf
test
等。在基于Debian的系统上以
make
运行时,这些内置的神秘选项可能会神秘地失败。     

要回复问题请先登录注册