这是我获取所有系统用户的代码:
def get_all_system_users
user_paths = Dir["#{ENV['HOME']}/../*"]
users = user_paths.map { |path| path.split("..")[-1].gsub(/\W/, '') }
users.select { |user| %x{id #{user}}.include?("uid") }
end
问题是 id#{user} 命令,该命令返回一直存在气泡的不存在用户的输出,与puts或pp完全相同。
如何将其静音但仍评估命令的输出?
答案 0 :(得分:1)
我更喜欢更直接的方式:(编辑:我认为已更新为与OSX合作)
def get_all_system_users
`dscacheutil -q user|grep name:|cut -d: -f2`.split
end
或者,处理多个操作系统:
require 'rbconfig'
def get_all_system_users
case RbConfig::CONFIG['host_os']
when /mac|darwin/i
`dscacheutil -q user|grep name:|cut -d: -f2`.split
when /linux/i
`cat /etc/passwd|grep "/home"|cut -d: -f1`.split
else
raise "InferiorOS Error" #or whatever
end
end
答案 1 :(得分:0)
您可以尝试将stderr重定向到stdout(或dev / null),但这取决于您的shell:
%x{id #{user} 2>&1}
..您将需要检测实用程序何时返回失败代码:
if $?.success?
答案 2 :(得分:0)
解析/etc/passwd
文件更容易:
Hash[File.readlines('/etc/passwd').map { |line|
line.split ':'
}.select { |field|
field[5].index('/home/') == 0 && File.directory?(field[5])
}.map { |field|
[field[0], field[2].to_i]
}]
这将返回一个哈希,用户名作为键, uid 作为值
具有/home/
下的现有主目录的所有用户。