Требование о том, что в этом выражении необходимы буквальные кавычки для XMLStarlet для поиска нужного элемента, является ложным.
Скорее всего, вы запускаете на месте команды редактирования, захватывая стандартный вывод имеет смысл только в контексте выберите команды (или обычного редактирования с заменой текста отправленного на стандартный вывод); для редактирования на месте, stdout будет пустым.
Если ваша цель состоит в том, чтобы захватить поток ошибок, связанные с операцией редактирования на месте:
warnings=$(xmlstarlet ed --inplace -u "/programs/program/log/@level" -v 4 "$file" 2>&1)
... скопирует STDERR на стандартный вывод, гарантируя, что это улавливается.
Тем не менее, если ваша цель захватить warnings
, чтобы проверить на успех, не полагаться на глядя на stderr; вместо этого проверьте статус выхода:
if warnings=$(xmlstarlet ed --inplace ... 2>&1); then
echo "Update succeeded" >&2
else
echo "Update failed: $warnings" >&2
fi
Вы пытались использовать символ эвакуации? например, '\ '/ programs/program/log/@ level \'' – Rao
все еще не успевают. – user4711416
++ xmlstarlet ed --inplace -u/programs/program/log/@ level -v 4 ./file.xml + BMWARNING = + '[' -z --info ']' + case $ {1 } в – user4711416