我想更改脚本中的工作组。所以我newgrp test_grp1
在剧本里写了一行。但我的脚本在运行此行后自动退出。有什么解决办法可以克服这个问题吗?
#/bin/ksh
...
newgrp test_grp1
...
笔记:我使用的是 Unix AIX 操作系统。
答案1
newgrp
使用您指定的组启动一个子 shell。因此,在该子 shell 完成之前,脚本中的该行将不会完成。
如果您使用or ,则 的处理newgrp
也会有所不同。将其实现为相当于.所以,就像,bash
ksh
ksh
exec /usr/bin/newgrp [group]
exec
newgrp
永远不会回来。 (参见一些文档这里.)
如果您希望它返回,并且希望使用更改的组标识在该子 shell 中执行命令,则可以使用重定向。
例如:
#!/bin/ksh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
id
EONG
echo "After newgrp"
注意:/usr/bin/newgrp
显式调用以避免隐式exec
from ksh
。该脚本中的最后一个命令将在原始 shell 中运行,并具有原始组标识。
答案2
一旦进程启动,它就无法获得任何额外的权限。因此,您无法在脚本中间获得组成员身份。您可以使用额外的组成员身份运行整个脚本:
newgrp test_grp1
/path/to/script
您无法更改真实的 GID 中间脚本。如果您确实需要,请切换到可以使用的语言,例如 Perl。不过,很少需要更改您的真实 GID,因为这并不重要。通常,偶尔调用chgrp
(首先创建没有组权限的文件,然后运行chgrp
,然后添加组权限就足够了;如果您创建具有组权限的文件,则存在竞争条件:第一个组中的用户可以打开在你有时间运行之前文件chgrp
)。