Команды 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"
Увидев этот ответ о 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 не будут запрашивать пароль, поскольку он уже был предоставлен.