Как использовать PlistBuddy, используя команду substution
Я пытаюсь следующий скрипт
#!/bin/bash
OUTPUT="$(cat /Users/admin/Desktop/plist-script-output/keys-updated.txt | sed 's/"//g; s/^/-c "Print :/g; s/$/"/g' | tr '\n' ' ')"
FILE="/Users/admin/Desktop/plist-script-output/plist-data/data.plist"
PLISTBUDDY=$(/usr/libexec/PlistBuddy $OUTPUT $FILE 2>&1)
echo "$PLISTBUDDY"
Результатом вышеупомянутого сценария является Нераспознанная Команда
Значение переменной OUTPUT равно
-c "Печать:Ant-Conversion" -c "Печать:Newitem" -c "Печать: область" -c "Печать: контакт"
2> & 1 это добавлено для печати как ошибок (не существует ключей), так и правильного вывода.
Keys-updated.txt содержит список ключей, которые необходимо извлечь из файлов plist (необязательно, все они присутствуют в plist)
РЕШЕНИЕ (НЕ РАБОТАЕТ)
Пробовал решение от @Nahuel. Однако линия
PLISTBUDDY=$(eval set - $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE")
предоставляет только список ключей, которых нет в списке
Это вывод, который я получаю после использования решения от @Nahuel
Печать: запись, "Статус", не существует
Печать: запись "Уведомить" не существует
Печать: запись "IsMvnMgrSupported" не существует
Печать: запись "BuildsetFile" не существует
Печать: запись "RollupClocReportToModule" не существует
Печать: Вступление, "Филиалы", не существует
Печать: запись "Муравьиная конверсия" не существует
Печать: запись, "IndexTag", не существует
Печать: Вступление, "WO", не существует
Печать: запись, "Теги", не существует
Печать: Вступление, "Newitem", не существует
ПО ИСПОЛЬЗОВАНИЮ КОМАНДЫ ПРЯМО В КОМАНДНОЙ ЛИНИИ
admin: Desktop admin $. / usr / libexec / PlistBuddy -c "Print: Area" -c "Print: Contact" -c "Print: Email" -c "Print: Language" -c "Print: Location" -c "Print: Name" -c "Печать: Заметки" -c "Печать: Назначение" -c "Печать: Отслеживание" -c "Печать: Тип" -c "Печать:URL" -c "Печать: Состояние" -c "Печать: Уведомление" -c " Печать:IsMvnMgrSupported" -c " Печать:BuildsetFile" -c " Печать:RollupClocReportToModule" -c " Печать: ветви "-c" Печать: Ant-Conversion "-c" Печать:IndexTag" -c " Печать:WO" -c "Печать: теги" -c "Печать:Newitem" /Users/admin/Desktop/plist-script-output/plist-data/ActiveMQ.plist
Выход оказывается
Мониторинг cucducheuneun. cdcdcdcdc. Джава. dvfvfvfvfvfvfv. ActiveMQ. cddcdcdcdc. Среда обмена сообщениями (JMS) от Apache Software Foundation.
Инфраструктура. Фреймворк. jdbcjdbcdjdcnnjn. Печать: запись, ": Статус", не существует. Печать: запись, ": Уведомить", не существует. Печать: запись, ":IsMvnMgrSupported", не существует. Print: Entry, ": BuildsetFile", не существует. Печать: запись, ":RollupClocReportToModule", не существует. Печать: Вступление, ": Филиалы", Не существует. Печать: Entry, ":Ant-Conversion", не существует. Print: Entry, ": IndexTag", не существует. Печать: Вступление, ":WO", не существует. Печать: запись, ": Теги", не существует. Печать: Вступление, ":Newitem", не существует. Ловушка отмены: 6
1 ответ
Посмотрев на sed и tr команды. Кажется, /Users/admin/Desktop/plist-script-output/keys-updated.txt содержит
Ant-Conversion
Newitem
Area
Contact
все можно сделать с помощью встроенных команд bash:
# local args arr pcmd (if inside a function)
# readarray -t arr </Users/admin/Desktop/plist-script-output/keys-updated.txt
# because readarray doesn't work on Mac
IFS=$'\n' read -d '' arr </Users/admin/Desktop/plist-script-output/keys-updated.txt
args=()
for pcmd in "${arr[@]}"; do
args+=(-c "Print :$pcmd")
done
PLISTBUDDY=$(/usr/libexec/PlistBuddy "${args[@]}" "$FILE" 2>&1)
Первый ответ:
OUTPUT='-c "Print :Ant-Conversion" -c "Print :Newitem" -c "Print :Area" -c "Print :Contact"'
Кавычки не являются синтаксическими, потому что обработка кавычек выполняется до раскрытия переменной.
Не безопасно (инъекция), в этом случае используется eval
PLISTBUDDY=$(eval /usr/libexec/PlistBuddy $OUTPUT $FILE 2>&1)
Не могу придумать что-то лучшее на данный момент
Немного лучше
PLISTBUDDY=$(eval set -- $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE" 2>&1)