如何将换行符分隔列表作为参数传递给另一个命令?

yuk*_*say 13 command-line bash pipe

所以我有一个用户名列表,例如:

user1
user2
user3
Run Code Online (Sandbox Code Playgroud)

我想申请id他们每个人并得到类似的东西:

uid=100(user1) gid=5(g1) groups=5(g1),6(g6),7(g10)
.
.
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?请注意,该列表是另一个命令 say 的输出mycommand

Olo*_*rin 18

使用xargs

mycommand | xargs -L1 id
Run Code Online (Sandbox Code Playgroud)

例子:

mycommand | xargs -L1 id
Run Code Online (Sandbox Code Playgroud)

您还可以在 bash 中循环输入:

mycommand | while read line
do
    id "$line"
done
Run Code Online (Sandbox Code Playgroud)

xargs将输入转换为命令的参数。该-L1选项告诉xargs将每一行用作命令调用的唯一参数。

  • 如果我知道它是换行符分隔的,并且输入流可能包含空格有一些危险,我会使用“-d\n”,原样:`mycommand | xargs '-d\n' -L1 id` 几乎总是一个好主意,以及所有 shell 变量的正确“$quoting”。 (2认同)

gle*_*man 5

使用 bash,您可以将输出行捕获到数组中:

mapfile -t lines < <(mycommand)
Run Code Online (Sandbox Code Playgroud)

然后迭代它们

for line in "${lines[@]}"; do
    id "$line"
done
Run Code Online (Sandbox Code Playgroud)

这不像 xargs 那样简洁,但如果您需要这些行来完成不止一件事,那么它非常有用。

  • 第一个“&lt;”是“mapfile”标准输入的通常重定向。`&lt;(...)` 是一个[进程替换](https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution)——进程替换对于避免由于问题而产生的问题非常有用到在子 shell 中运行的管道。 (2认同)