Если вы используете bash
, это должно работать:
$ cat env/setenv.sh
WORKING_DIR="$(dirname "${BASH_SOURCE[0]}")"
printf '%s is located in directory %s\n' \
"$(basename "${BASH_SOURCE[0]}")" "$(dirname "${BASH_SOURCE[0]}")"
PYT_FILE="$WORKING_DIR/script.pyt"
printf 'Python script %s is located in directory %s\n' \
"$(basename "${PYT_FILE}")" "$(dirname "${PYT_FILE}")"
printf 'Path to Python script is %s\n' "${PYT_FILE}"
$../env/setenv.sh
setenv.sh is located in directory./env
Python script script.pyt is located in directory./env
Path to Python script is./env/script.pyt
Использование envsubst
будет работать, если значения ваших переменных «хорошие» и не нужно кодировать JSON. Это также требует, чтобы ваши переменные были экспортированы.
Однако, как только у вас есть специальные значения в ваших переменных, это разваливается:
$ jq. file
{
"set1": {
"string1": "${VAR1}",
"string2": "${VAR2}"
}
}
$ export VAR1='line 1
line 2'
$ export VAR2='"hello"'
$ envsubst <file | jq.
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 4, column 7
Вместо этого обрежьте ${
в начале и }
в конце значений в файле JSON и используйте оставшуюся строку для поиска значения во внутренней $ENV
переменной (объекта. хранение переменных окружения в виде пар ключей -значений):
$ jq '.[][] |= ( ltrimstr("${") | rtrimstr("}") | $ENV[.] )' file
{
"set1": {
"string1": "line 1\nline 2",
"string2": "\"hello\""
}
}
.[][]
извлекает пути значений, а |=
является оператором обновления. Таким образом, значения обновляются путем поиска значений переменных среды, которым они соответствуют, и замены их этими значениями.
С приведенным выше кодомстрока, не соответствующая существующей переменной окружения, будет заменена наnull
:
$ jq. file
{
"set1": {
"string1": "${VAR1}",
"string2": "${VAR2}",
"string3": "${bumblebee}"
}
}
$ jq '.[][] |= ( ltrimstr("${") | rtrimstr("}") | $ENV[.] )' file
{
"set1": {
"string1": "line 1\nline 2",
"string2": "\"hello\"",
"string3": null
}
}