Как использовать 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)
Другие вопросы по тегам