你遇到错误的原因是make(特别是GNU make)尝试执行多个优化操作之一。其中之一是,如果该命令似乎是不需要shell的简单命令,则make将直接通过fork/exec调用它,而不运行shell。如果该命令只作为shell内置命令存在,则这种方法将无效。你的命令行“ulimit -c 10000”是一个简单的命令,并且ulimit并没有定义为make知道的仅是Shell内置命令,因此make将尝试直接fork/exec ulimit。因此,解决你的问题的一种方法是简单地添加一个对Shell(最明显的是“;”)有特殊含义的字符,这将提示make需要将此命令发送给Shell。
但是,这对你来说行不通。
与H2CO3上面的评论恰恰相反:
鉴于它提供的功能,它怎么可能是[一个shell内置命令]?你必须问自己相反的问题:
鉴于它提供的功能,它怎么可能不是一个shell内置命令?ulimit的man页面清楚地说明了:
ulimit实用程序设置或报告由shell和其子进程写入的文件强制执行的文件大小限制,并进一步指出:
由于ulimit影响当前的shell执行环境,因此它始终作为shell常规内置提供。
你必须记住,在UNIX中,一个进程几乎不可能修改其父进程的任何方面。它只能修改自身或调用的任何子进程。这包括环境变量、工作目录以及ulimit设置。
那么,好的,这如何适用于你的情况呢?你必须记住,make配方中的每个逻辑行都在单独的shell中调用。所以对于像下面这样的命令:
core: myprogram
ulimit -c 10000 ;
./myprogram
ulimit -c 0 ;
(添加分号以强制运行shell)基本上make调用的是这个:
core: myprogram
/bin/sh -c 'ulimit -c 10000 ;'
/bin/sh -c './myprogram'
/bin/sh -c 'ulimit -c 0 ;'
正如您所看到的,每个ulimit都在自己的shell中调用,因此它实际上是无用的。 它将修改该shell的核心文件大小限制,然后该shell退出并且更改会丢失,然后使用原始ulimit调用您的程序,然后又调用第三个shell并将cores的ulimit设置为0(同样无用)。
您需要做的是将所有这些命令放在单个逻辑行上,像这样:
core: myprogram
ulimit -c 10000; ./myprogram
(你不需要将限制设置回来,因为shell无论如何都会退出)。
顺便提一下,这就是为什么make不太担心这些shell内置命令。像这样的内置命令基本上不可能在不需要使用某些特殊的shell字符(比如分号)的情况下发挥任何作用。
ulimit
不是shell内置命令。(考虑到它提供的功能,它怎么可能是一个内置命令呢?) - user529758/usr/bin/ulimit
可执行文件呢? - user529758test
或其他一些东西一样。许多内置函数会复制一个二进制程序。但是,这是首先使用的内置函数。 - perror