Запуск псевдонима или функции в фоновом режиме

Команды setили declareсами по себе выведут все переменные оболочки и их значения (и дополнительно выведут определения функций ).declare -pне будет выводить определения функций, но будет аннотировать каждую переменную ее типом (, например. -rтолько для чтения -, -aдля массива и т. д. )Команда exportсама по себе будет печатать переменные среды (экспортированные переменные оболочки ), как envи printenv.

Используются ли переменные или нет в текущем сеансе оболочки, не обязательно будет обнаружено в выводе этих команд. Оболочка bashимеет ряд переменных, которые существуют в любом сеансе оболочки , таких как RANDOMи EUID, независимо от того, используются они или нет. Переменная также может быть недоступна в текущей области при вызове declare, например, если это локальная переменная в функции, или если она была unset, или если она была объявлена ​​в оболочке sub -. который больше не активен.

Если вы хотите увидеть переменные, созданные в определенном скрипте, вам нужно будет сохранить вывод, например. declare -pв начале сценария, а затем сравните это с другим вызовом той же команды в конце сценария (или там, где вы хотите исследовать объявленные в настоящее время переменные ).

Пример:

#!/bin/bash

tmpfile=$(mktemp)
declare -p >"$tmpfile"

say_hello() {
    name="$1"
    echo "Hello $name"
}

my_name="Luis Daniel"
my_age="29"

say_hello "$my_name"

declare -p | diff "$tmpfile" -
rm -f "$tmpfile"

Запуск:

$ bash script.sh
Hello Luis Daniel
46c46,49
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
> declare -- name="Luis Daniel"

Обратите внимание, что объявление nameв качестве переменной localв функции, поскольку она недоступна при втором вызове declare -p, приведет к созданию

Hello Luis Daniel
46c46,48
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
1
09.04.2021, 19:49
1 ответ

Увидев этот ответ о sudo в фоновом режиме и проделав некоторые пробы и ошибки, я решил проблему, проверив привилегии пользователя отдельно перед выполнением команды в фоновом режиме:

alias OpenVPN='read -p "VPN name: " VPN_NAME
my_path=~/.openvpn.confs/${VPN_NAME}/OpenVPN
VPN_CONF=${my_path}/vpnconfig.ovpn
sudo -v
sudo openvpn --config $VPN_CONF'

Здесь sudo -vозначает validate , что означает, что он проверяет и обновляет временную метку пользователя sudo без запуска команды. Как только это будет сделано, следующие команды sudo не будут запрашивать пароль, поскольку он уже был предоставлен.

0
28.04.2021, 22:53

Теги

Похожие вопросы