前書き

自動化Script作成時に、Bash (Shell Script)ではなく、RubyやPython3を用いた方がScriptのメンテナンス負荷が低くなります。自動化Scriptに使用するプログラミング言語変更を目的として、各言語の実装を比較します。

本記事では、ユーザ名 / UID / グループ名 / GIDを取得する方法を比較します。比較では、実装例および実行例をそれぞれ示します。

Bashではなく、RubyやPython3を使った方が好ましい理由は、以下の記事に記載しています。この記事には、各プログラミング言語の様々な実装(ディレクトリ操作やファイル操作など)を比較した他記事へのリンクを一覧にまとめています。

各言語のVersion

  • Bash:GNU bash, バージョン 5.0.3(1)-release
  • Ruby:ruby 2.5.5p157 (2019-03-15 revision 67260)
  • Python:Python 3.7.3

比較:ユーザ名 / UID / グループ名 / GIDを取得する方法

自動化Scriptでは、特定ユーザや特定グループのみに操作を許可する事があります。そのような場合に、ユーザ名やグループ名を取得する処理が必要になります。

以下に、各言語の実装例および実行例を示します。

Bashの場合

#!/bin/bash

echo "ユーザ名、ユーザID、グループ名、グループIDの表示"
USER_NAME=$(id -u -n)
USER_ID=$(id -u)
GROUP_NAME=$(id -g -n)
GROUP_ID=$(id -g)  # プライマリグループのみ。
echo "ユーザ名 :${USER_NAME}"
echo "UID      :${USER_ID}"
echo "グループ名:${GROUP_NAME}"
echo "GID      :${GROUP_ID}"

Rubyの場合

#!/usr/bin/env ruby

require 'etc'

puts("ユーザ名、ユーザID、グループ名、グループIDの表示")
user_id    = Process.uid
user_name  = Etc.getpwuid(user_id).name
group_id   = Process.gid
group_name = Etc.getgrgid(group_id).name

puts("ユーザ名 :" + user_name)
puts("UID      :" + user_id.to_s())
puts("グループ名:" + group_name)
puts("GID      :" + group_id.to_s())

Python3の場合

#!/usr/bin/env python3

import os
import getpass
import grp

print("ユーザ名、ユーザID、グループ名、グループIDの取得")
user_id    = os.getuid()
user_name  = getpass.getuser()
group_id   = os.getgid()
# getgrgid()はリストを返し、
# [0]グループ名、[1]暗号化されたグループパスワード、
# [2]GID、[3]グループメンバの全てのユーザ名
group_name = grp.getgrgid(group_id)[0]

print("ユーザ名 :" + user_name)
print("UID:" + str(user_id))
print("グループ名:" + group_name)
print("GID      :" + str(group_id))

Bash、Ruby、Python3の実行例

$ ./bash.sh 
ユーザ名、ユーザID、グループ名、グループIDの表示
ユーザ名 :nao
UID      :1000
グループ名:nao
GID      :1000

$ ./ruby.rb 
ユーザ名、ユーザID、グループ名、グループIDの表示
ユーザ名 :nao
UID      :1000
グループ名:nao
GID      :1000

$ ./python.py 
ユーザ名、ユーザID、グループ名、グループIDの取得
ユーザ名 :nao
UID      :1000
グループ名:nao
GID      :1000