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

问题描述 投票:0回答:1

我被这个咬了 ksh93 bug (也是 此处). 下面是一个 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 电话 set_ac 在一个子壳中,转让 a=1 传播到父壳。有几个已知的 变通办法 而我倾向于那个说要取代 set_abc 以上与

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

这样看来效果还不错。现在我想知道,是否有任何副作用的 ulimit -t unlimited 除了激起子shell的fork之外(这是工作方法的重点),这可能会在将来给我带来麻烦。(FWIW: 这应该是由一个没有root权限的用户运行的。)

ksh ulimit
1个回答
1
投票

最新的 ksh93 版本对 non-forkingvirtual subshells 的实现充满了错误。子shell应该是一个从父shell环境中复制出来的环境,但又与父shell环境完全分离。强制子shell分叉将这种分离委托给了内核,而内核是非常强大的。所以唯一的副作用应该是:(1)性能明显变慢,(2)错误大大减少。

至于 ulimit 本身,使用 unlimited 参数应该也不会引起任何副作用,因为这是默认的。唯一的可能是,父 shell 环境已经用 ulimit -t; 在这种情况下,你没有权限将其设置为回溯到 unlimited 并打印一个错误信息。但是,它仍然会强制分叉。所以为了完全安全起见,你可以使用 ulimit -t unlimited 2>/dev/null 而不是抑制任何可能的错误信息。

© www.soinside.com 2019 - 2024. All rights reserved.