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