是否有一段[短]代码可以将符号组名称(例如staff
)转换为数字组号(例如82
)?
代码在 OS X 和 GNU/Linux 上的运行方式应该相同。
答案1
使用Python的grp
模块是足够简单。作为初学者的核心思想:
import grp
print(grp.getgrnam("my_group_name").gr_gid)
然而,一个更强大的解决方案花了我更长的时间:
echo $MYGROUPNAME | python -c 'import grp,sys; gn=sys.stdin.readline().strip(); [gid]=[g.gr_gid for g in grp.getgrall() if g.gr_name==gn][:1]; print(gid)'
首先,它是为两者都工作而编写的蟒蛇2和蟒蛇3。
第二:它不使用grp.getgrnam()
,但会获取所有组并进行自己的过滤。为什么?因为getgrnam()
在我测试过的至少一台 Mac 上根本无法工作。
第三:它截断多个结果。为什么?因为grp.getgrall()
在我测试的至少一台 Gentoo 上返回了重复项。
最后:是的,不存在的组会抛出回溯。根据您自己的需要进行调整。
注意 这个问题提供了一些位,但它已被关闭,不接受新的答案并且无法迁移。所以在这里你有一个自我答案。
答案2
接听特登的评论:
Linux(Debian 12,书呆子):
bookworm$ export mygroupname=staff
bookworm$ awk -F: -v group=${mygroupname} '$1==group{print $3}' /etc/group
50
MacOS 索诺玛 14.4:
sonoma$ export mygroupname=staff
sonoma$ awk -F: -v group=${mygroupname} '$1==group{print $3}' /etc/group
20
请注意,通常不鼓励使用大写变量名称,以避免与系统范围标识符发生潜在冲突。
另请注意,如果该组不存在,这不会出错。