回应@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
几个小组将他们的名字分开。要获得所需的输出,我们需要使用id命令,该命令带有--zero(-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 ]