1

Я пытаюсь заставить каждого пользователя использовать 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 ответ1

1

Проблема в -n1I'{}' . Вы хотите разделить эти два параметра, иначе xargs не сможет их правильно проанализировать. По сути, после каждого аргумента option (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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .