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
来抑制任何可能的错误消息。
我被这个 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
来抑制任何可能的错误消息。