ksh93 中 "ulimit -t unlimited" 的副作用是什么?

What are the side effects of "ulimit -t unlimited" in ksh93?

我被这个 ksh93 bug (also here). Here is a SSCCE 接近我的用例所困扰:

$ cat bug.sh
#!/bin/ksh93

unset a b
c=0

function set_ac { a=1; c=1; }
function set_abc { ( set_ac ; b=1 ) }

set_abc
echo "a=$a b=$b c=$c"

$ ./bug.sh
a=1 b= c=0

因此,虽然 set_abc 在子 shell 中调用 set_ac,但赋值 a=1 传播到父 shell。有一些已知的 workarounds,我倾向于将上面的 set_abc 替换为

function set_abc { ( ulimit -t unlimited ; set_ac ; b=1 ) }

这似乎工作正常。现在我想知道 ulimit -t unlimited 除了引起 subshell 分叉(这是解决方法的要点)之外是否有任何副作用会在未来给我带来麻烦。 (FWIW:这应该是 运行 由没有 root 权限的用户完成的。)

最新的 ksh93 版本 non-forking/virtual subshells 的实现充满了错误。 subshell 应该是从父 shell 环境中复制但完全分离的环境。强制 subshell 分叉将分离委托给内核,这是非常健壮的。所以唯一的副作用应该是 (1) 性能明显变慢和 (2) 错误更少。

至于 ulimit 本身,使用 unlimited 参数也不应引起任何副作用,因为这是默认设置。唯一的可能性是父 shell 环境已经用 ulimit -t 限制了 CPU 时间;在这种情况下,您无权将其设置回 unlimited 并且它会打印一条错误消息。但是,它仍然强制分叉。因此,为了完全安全,您可以改用 ulimit -t unlimited 2>/dev/null 来抑制任何可能的错误消息。