我有以下脚本:
#!/bin/sh
echo "OUTPUT:"
gcc temp.c
echo "ACTOP"
ulimit -t 1
ulimit -f 1024
ulimit -u 3
./a.out > out.txt
我得到的输出是
OUTPUT:
ACTOP
ulimit: 7: Illegal option -u
但如果我ulimit -u 3
直接在终端中使用,它就可以工作。不过-t
和-f
选项工作正常。
当我将 shebang 更改为 时#!/bin/bash
,它可以工作,但现在它拒绝执行代码,除非允许的进程数 > 132。任何小于 ulimit -u 132 的值都不允许执行。我可以直接在终端中使用ulimit -u 3
。
答案1
ulimit
是 shell 的内置命令,而不是程序:
$ type ulimit
ulimit is a shell builtin
这意味着它ulimit
可能不会以相同的方式在每个 shell 上工作。
Ubuntu 中的默认 shell 是 Bash,它是您从终端使用的 shell。
但是,您在脚本中所使用的sh
(默认情况下)是由 Dash 提供的,Dash 是一个与 Bash 类似但不同的 shell。比较一下:
$ bash
$ ulimit -u
29901
$ dash
$ ulimit -u
dash: 1: ulimit: Illegal option -u
您的问题至少有两种解决方案:
- 将您的事情从 更改
#!/bin/sh
为#!/bin/bash
; - 用
-p
代替-u
。
我推荐第一种解决方案,因为 Bash 比 Dash 具有更多功能。缺点是 Bash 速度较慢,但如果您的脚本对性能要求不高,那么这不是问题。
有关 Bashulimit
和 Dash之间的差异的更多信息ulimit
,您可以查看man bash
和man dash
,然后输入执行搜索/ulimit
。此外,Bash 提供了一个help
内置命令,您可以将其用作手册页的替代。