从脚本运行时,ulimit -u 给出非法选项错误,但从终端运行时则不会

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.

And*_*ini 4

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)

您的问题至少有两种解决方案:

  1. 将您的 shebang 从 更改#!/bin/sh#!/bin/bash;
  2. 使用-p而不是-u.

我会推荐第一个解决方案,因为 Bash 比 Dash 有更多的功能。缺点是 Bash 速度较慢,但​​如果您的脚本对性能不是关键的,那么这不会成为问题。

有关 Bashulimit和 Dash之间差异的更多信息ulimit,您可以查看man bashman dash,然后执行搜索输入/ulimit。此外,Bash 还提供了一个help内置函数,您可以使用它来替代手册页。