Как установить заголовок оболочки zsh, не выполняя подстановки команд дважды?

Следуя предложению Марка Плотника о преобразовании структурированного XML-вывода

diskutil apfs list -plist

в JSON и парсинг с помощью jq. Утилита jqдоступна в Homebrew для macOS.

Это нужно сделать в два этапа, так как plutilнужно прочитать обычный файл:

diskutil apfs list -plist >list.xml
plutil -convert json -o list.json list.xml

Из сгенерированного файла JSON мы можем извлечь UUID тома APFS всех томов, для которых включен FileVault и которые заблокированы, используя

jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' list.json

Присвоение этого переменной одной "одной" командой:

locked_uuids=$(
    diskutil apfs list -plist >list.xml
    plutil -convert json -o list.json list.xml
    jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' list.json
    rm -f list.xml list.json
)

Обратите внимание, что приведенная выше команда перезаписывает и удаляет два файла list.xmlи list.jsonв текущем каталоге. Вы можете создать временные файлы, используя mktempвместо :

.

locked_uuids=$(
    tmpxml=$(mktemp)
    tmpjson=$(mktemp)
    diskutil apfs list -plist >"$tmpxml"
    plutil -convert json -o "$tmpjson" "$tmpxml"
    jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' "$tmpjson"
    rm -f "$tmpxml" "$tmpjson"
)

И для удобства вы можете поместить эти команды в функцию оболочки и вызвать ее вместо (, используя bashздесь):

list_locked_vaults () {
    local tmpxml=$(mktemp)
    local tmpjson=$(mktemp)
    diskutil apfs list -plist >"$tmpxml"
    plutil -convert json -o "$tmpjson" "$tmpxml"
    jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' "$tmpjson"
    rm -f "$tmpxml" "$tmpjson"
}

locked_uuids=$( list_locked_vaults )

0
03.07.2020, 08:03
0 ответов

Теги

Похожие вопросы