Вы также можете использовать tmux (, который немного похож на screen ), но я думаю, что его проще использовать.
sudo apt-get install tmux
tmux new -s <session-name>
затем запустите свой скрипт в сеансе нажмите control + b + d, чтобы отсоединить
если вы хотите вернуться к терминалу, просто выполните
tmux a
Преимущество в том, что вы можете легко проверить, если что-то пошло не так, но если вы хотите загрузить много файлов одновременно, может быть проще проверить журнал
bash
позволяет иметь переменные, которые ссылаются на переменные, например:
REF='USER' # or get it from JSON
echo "${!REF}"
# prints current username
Итак, вы можете написать это:
ENVIRONMENT_REF="$(jq -r '.environment' "properties.json")"
ENVIRONMENT="${!ENVIRONMENT_REF}"
Содержимое JSON:
"environment": "USER"
Другой вариант, возможно, лучше (, но определенно НЕ безопасный)используетeval
:
ENVIRONMENT="$(eval "echo $(jq -r '.environment' "properties.json")")"
Обратите внимание, что это небезопасно и вредоносный код может быть вставлен в файл JSON. Какой вредоносный код? Заглянем в этот properties.json
файл:
{
"environment": "$(rm some_file)"
}
Оболочка будет eval
использовать этот код:
echo $(rm some_file)
… и файл с именем some_file
будет удален. Как видите, в зависимости от введённой туда команды можно нанести очень серьёзный урон.
jq
обеспечивает доступ к своей среде через $ENV
объект -, аналогичный хэшу Perl $ENV
или ассоциативному массиву ENVIRON
awk. Например, если предположить, что (соответствует принятому ответу ), ваш файл properties.json выглядит так
{
"environment": "USER"
}
тогда можно
$ environment="$(jq -r '$ENV[.environment]' properties.json)"
$ echo "$environment"
steeldriver
(лучше избегать ALLCAPS для ваших переменных оболочки ). Если ваш файл выглядит как
{
"environment": "$USER"
}
включая расширение оболочки -$
, то вы можете использовать тот же метод после удаления$
:
environment="$(jq -r '$ENV[.environment | sub("^\\$";"")]' properties.json)"
В качестве альтернативы вы можете передать результат простого поиска с помощью внешней envsubst
команды:
$ environment="$(jq -r '.environment' properties.json | envsubst)"
$ echo "$environment"
steeldriver
См., например, Заменить переменные среды в файле их фактическими значениями?
Один из способов может быть следующим
ENVIRONMENT=$(printenv $(jq -r '.environment' properties.json |
cut -c2-))
Это всего лишь небольшой пересказ -один из других ответов .
В терминале Linux создайте локальную папку:
$ mkdir -p ~/unix.se/jq/ && cd ~/unix.se/jq/
Создать файлproperties.json
:
$ echo '{"environment":"USER"}'>properties.json && cat properties.json
{"environment":"USER"}
Дополнительное примечание -красивое форматирование с помощьюjq
:
$ jq '.' properties.json
{
"environment": "USER"
}
Используйте значение ключа JSON environment
, чтобы установить новую переменную среды и показать ее содержимое:1
$ JQ_USER=$(jq -r '$ENV[.environment]' properties.json) && echo $JQ_USER
tedly
Пока все хорошо, но проблема в том, что я лгу. (!)-properties.json
файл не выглядит совсем как выше, так как в нем есть доллар знак перед USER
, вот так:
$ echo '{"environment":"$USER"}'>properties.json && cat properties.json
{"environment":"$USER"}
Избавившись от мешающего знака доллара, например, заменив пустая строка для него, мы можем вернуться к уже работающему решению:
$ JQ_USER=$(jq -r '$ENV[.environment | sub("\\$";"")]' properties.json)
echo $JQ_USER
tedly
1 Когда я впервые запустил это,Я получил сообщение об ошибке, начинающееся с jq: error: ENV/0 is not defined at <top-level>
. Оказывается, для$ENV[]
требуется версия 1.6(или более поздняя )из jq
.