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