abc = ok
присваивает значение переменной abc
. declare abc
объявляет переменную с именем abc
. Их можно объединить, как объявление abc = ok
.
В bash, как и в других оболочках, не нужно объявлять строковые и массивные переменные, поэтому объявление
не требуется, если вы не хотите передавать параметры, например объявить -A abc
, чтобы сделать abc
ассоциативным массивом, или объявить -r
, чтобы сделать переменную доступной только для чтения. Однако внутри функции declare
действительно имеет значение: оно заставляет переменную быть локальной для функции, а это означает, что значение переменной вне функции (если есть) сохраняется. (Если вы не используете declare -g
, что делает переменную не локальной; это полезно в сочетании с другими параметрами, например, declare -gA
для создания глобального ассоциативного массива в функции. ) Пример:
f () {
declare a
a='a in f'
b='b in f'
echo "From f: a is $a"
echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"
Вывод:
From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f
Еще одна вещь, которую вы можете сделать с помощью встроенной команды declare
, - это
Встроенная функция declare
уникальна для bash. Он сильно вдохновлен и очень близок к встроенному в ksh typeset
, а bash предоставляет typeset
как синоним declare
для совместимости. (Я не знаю, почему bash не назвал это просто наборным
). Есть третий синоним, местный
. Также существует export
, который аналогичен declare -x
, опять же для совместимости (с каждой оболочкой в стиле Борна).
Не удалось заставить это работать напрямую, но запуск сценария оболочки из файла автозапуска работает, и он может содержать переменные среды. Однако не забудьте запустить через оболочку, так что...
# In.../autostart place this
@/bin/bash /usr/bin/script_with_env_vars.sh
#
# Calling directly will not work
@/usr/bin/script_with_env_vars.sh - fails!!!
Это можно сделать с помощью.xinitrc. Обратите внимание, что если.xinitrc существует, он отвечает за запуск среды рабочего стола (startlxde/startkde/... ). Я попытался просто установить TERM и выйти, и мой вход в XDE просто разбился.
#!/bin/bash
export TERM=linux
exec startlxde
Попытка запустить дочерний процесс для установки среды бесполезна, так как он благополучно изменяет свою собственную среду, а затем завершается, оставляя среду родительского процесса неизменной.