使用 xargs 将 dscl -list 的输出传输到 -dscl read 时遇到问题

使用 xargs 将 dscl -list 的输出传输到 -dscl read 时遇到问题

我试图让每个用户使用和dscl读取他们的每条记录。不过,我不确定我做错了什么,因为我希望这个命令能获取每一行输出并将其放在原处。xargsdscl{}

2rs2ts:~/ $ dscl . -list /Users | xargs -n1I'{}' dscl -plist . -read /Users/{}
<dscl_cmd> DS Error: -14136 (eDSRecordNotFound)
<dscl_cmd> DS Error: -14136 (eDSRecordNotFound)
<dscl_cmd> DS Error: -14136 (eDSRecordNotFound)
<dscl_cmd> DS Error: -14136 (eDSRecordNotFound)
... and so forth

第一个命令的输出看起来不错......

2rs2ts:~/ $ dscl . -list /Users
2rs2ts
_amavisd
_appleevents
... and so forth

我甚至将其管道化xargs -n1 echo,看起来不错。我echo先使用其他方法,它按预期工作。我也尝试过使用-L1,但无济于事。我错过了什么?

我知道我可以用-readall它来做这个,但我只是想用它xargs来好玩。

答案1

问题是-n1I'{}'。您想拆分这两个选项,否则xargs无法正确解析它们。基本上,在每个选项参数(在您的例子中)之后1'{}'您都需要一个空格分隔符:

dscl . -list /Users | xargs -n1 -I'{}' dscl -plist . -read /Users/{}

或者,如果您只想使用一个简单的循环:

for user in $(dscl . -list /Users); do dscl -plist . -read /Users/"$user"; done

while read可以使用流程替代

while read user; do dscl -plist . -read /Users/"$user"; done < <(dscl . -list /Users)

或者你通过管道传输:

dscl . -list /Users | while read user; do dscl -plist . -read /Users/"$user"; done

相关内容