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

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

我有以下脚本:

#!/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

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

  1. 将您的事情从 更改#!/bin/sh#!/bin/bash
  2. -p代替-u

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

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

相关内容