Здесь есть три набора «переменных».
declare
. execve
для запуска внешней команды в этом дочернем процессе. Первый набор — это «переменные среды текущей оболочки». Второй набор — это переменные оболочки , а третий набор — это переменные окружения дочернего процесса .
Хотя оболочка Bourne Again может изменить свои переменные среды процесса и сделать это изменение видимым для других процессов, как я объяснял в https://unix.stackexchange.com/a/432681/5132, на практике оболочка Bourne Again этого не делает.
Точно так же оболочка Bourne Again может предоставлять доступ к своим переменным среды, но это не так, а только предоставление доступа к переменным оболочки , производным от этих переменных среды. при запуске программы-оболочки.
(Я упомянул оболочку Bourne Again из-за вопроса, но на самом деле большинство оболочек ведут себя аналогично, и на самом деле это не относится к оболочке Bourne Again.)
И, конечно же, внешние программы, такие как env
и printenv
, отображают третий набор переменных.
Чтобы увидеть переменные среды текущего процесса оболочки, нужно использовать внешнюю команду:
ps ewwww -p $$
или
hexdump -C /compat/linux/proc/$$/environ
(просто /proc
в операционных системах Linux )
Для этого можно использовать анализатор XML. Напримерxmlstarlet
(XML-инструмент командной строки):
$ xmlstarlet ed -u '//client-version' -v '1.2.9' file.xml
<?xml version="1.0"?>
<client-version>1.2.9</client-version>
Приведенная выше команда найдет все вхождения узла документа client-version
и изменит их значения на строку 1.2.9
.
Чтобы изменить только те, что 1.2.8
, вы должны использовать
xmlstarlet ed -u '//client-version[text() = "1.2.8"]' -v '1.2.9' file.xml
Перенаправьте вывод в новый файл, проверьте его и переименуйте в исходное имя файла или запустите xmlstarlet
с параметрами -L
или --inplace
, чтобы отредактировать файл в месте -.
Использование xq
, из yq
, из https://kislyuk.github.io/yq/, что позволяет использовать jq
выражения для изменения XML-документов:
xq -x '(..|."client-version"? // empty) |= "1.2.9"' file.xml
Это обновляет значение каждого узла client-version
на 1.2.9
независимо от того, где в документе он расположен.
Строка 1.2.9
может быть вставлена из такой переменной:
new_version=1.2.9
xq -x --arg ver "$new_version" '(..|."client-version"? // empty) |= $ver' file.xml
Пробовал с командой awk ниже, все работает нормально
awk '$0 ~ /^<client-version>/ && $0 ~ /<\/client-version>/{gsub("1.2.8","1.2.9",$0)}1' orginalfile >temperorayfile && mv temperorayfile orginalfile