@Chris のコメントに応えて
<ブロック引用>これは、名前にスペースが含まれていないグループに対してのみ機能します!
@c4f4t0r による承認された解決策と @bibi による解決策は、ほとんどの場合に機能することに言及する必要があります。 Cygwin を実行しており、Windows
方程式の一部は、おそらく、私がこの問題に頻繁に遭遇する理由です。それでも、通常の Linux では標準外の文字を使用してグループを作成できます (私はそう思います)。そのため、グループ名にスペースを使用する場合の解決策を示します。スペースはいつでも人生を楽しくしてくれます!
スペースが問題を引き起こす例を簡単に挙げます。スペースを含むグループ名を確認するには、id
の出力全体を確認します
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(注:StackOverflow では、出力をもう少し見やすいものにしました。)
これから、グループが {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
であることがわかります
この場合、受け入れられた解決策に問題があることがわかります。
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
いくつかのグループは名前が分かれています。必要な出力を取得するには、--zero
を受け取る id コマンドを使用する必要があります。 ( -z
) 国旗。 id
に渡されるすべてのフラグの詳細については、 、こちらをご覧ください。
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
私たちのアプローチは、上記のものとは少し異なる必要がありますが、多くの同じ原則に従います:
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
少し複雑な awk
がある理由 末尾に常に NUL
があるということです 、この場合は必要ありません。 \
同じコマンドで次の行に進むことができるので、読みやすくなります。このコマンドは以下と同等です:
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
私が見たところ、ユーザーのグループを yaml
に変換しようとしています 配列、使用してみてください:
echo "groups:" ; for i in $(id -Gn myuser);do echo " - $i" ;done
groups:
- users
- lp
- vboxusers
- kvm
あなたも使うことができます:
echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"
groups: [ myuser, lp, vboxusers, kvm ]
bash
を使用 :
for i in `groups`; do echo $i; done
tr
を使用 :
groups | tr \ \\n