Tendo problemas na saída de pip de dscl -list para -dscl, usando xargs

1

Estou tentando fazer com que todos os usuários usem dscl e leiam cada um dos registros usando xargs e dscl . Eu não tenho certeza do que estou fazendo errado, porque eu esperaria que esse comando pegasse cada linha de saída e colocasse onde {} é.

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

A saída do primeiro comando parece bem ...

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

Eu até pipe isso para xargs -n1 echo e parece bem. Eu echo outra coisa primeiro e funciona como esperado. Eu também tentei usar -L1 , mas não adiantou. O que estou perdendo?

Eu sou ciente de que posso usar -readall para isso, mas eu estava apenas tentando usar xargs para diversão.

    
por 2rs2ts 17.07.2013 / 20:54

1 resposta

1

O problema é -n1I'{}' . Você deseja dividir essas duas opções, caso contrário xargs não poderá analisá-las corretamente. Basicamente, após cada argumento de opção ( 1 e '{}' no seu caso), você precisa de um separador de espaço em branco:

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

Ou, se você quiser apenas usar um loop simples:

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

Com while read , você pode usar a substituição de processos :

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

... ou você canaliza:

dscl . -list /Users | while read user; do dscl -plist . -read /Users/"$user"; done
    
por 17.07.2013 / 20:59