Termux — один из самых гибких способов превратить Android-устройство в полноценное рабочее окружение. Однако по-настоящему «включается» продуктивность, когда вы настраиваете оболочки под свои сценарии: разные проекты требуют разных переменных окружения, разные языки — разных путей инициализации, а запуск сопутствующих сервисов должен происходить автоматически.
В этой статье покажу подход к «тонкой настройке профилей» для zsh и fish в Termux: как организовать динамическое переключение окружения по контексту и как сделать автозапуск скриптов без потери контроля.
Подготовка: базовая структура и соглашения
В Termux наиболее удобна схема, когда все пользовательские скрипты и профили живут в одном месте, а оболочка лишь вызывает «правильную» инициализацию. Рекомендуемый принцип:
- держать переменные окружения и функции в профилях;
- хранить контекстные настройки (для конкретных проектов/папок) отдельно;
- автозапуск делать через явные точки входа (файлы), чтобы легко отлаживать.
Создадим рабочие директории в домашнем каталоге:
mkdir -p ~/.config/termux-shell/{zsh,fish,env-scripts}
Дальше будем класть:
~/.config/termux-shell/env-scripts/— общие и контекстные скрипты;~/.config/termux-shell/zsh/— код, специфичный для zsh;~/.config/termux-shell/fish/— код, специфичный для fish.
Установка и выбор оболочки
Если вы ещё не используете zsh или fish в Termux, установите нужные пакеты. В зависимости от текущего состояния репозиториев команды могут незначительно отличаться, но базово используется:
pkg update
pkg install zsh fish
Далее можно переключаться в Termux, выбрав оболочку в настройках или запустив нужную команду. Например, для проверки:
zsh --version
fish --version
zsh: профили инициализации с динамическим окружением
Ключевая идея: оболочка должна определять контекст (например, по текущей директории) и подгружать набор переменных окружения. В zsh удобно использовать обработчики и функции, которые вызываются при смене директории.
1) Общий «контекстный» фреймворк для zsh
Создадим файл, который будет отвечать за подгрузку нужного окружения. Например, ~/.config/termux-shell/zsh/env_loader.zsh:
cat > ~/.config/termux-shell/zsh/env_loader.zsh <<'EOF'
# env_loader.zsh — подгрузка окружения в зависимости от текущей директории
# Список поддерживаемых контекстов можно расширять по мере необходимости.
# Идея: в корне проекта лежит файл, например .envrc-termux или .termux-env
_termux_env_cache=""
function _termux_find_env_file() {
# Ищем ближайший файл контекста вверх по дереву.
local dir="$PWD"
while [ "$dir" != "/" ] && [ "$dir" != "$HOME" ]; do
if [ -f "$dir/.termux-env" ]; then
echo "$dir/.termux-env"
return 0
fi
if [ -f "$dir/.envrc-termux" ]; then
echo "$dir/.envrc-termux"
return 0
fi
dir="$(dirname "$dir")"
done
return 1
}
function _termux_load_env_for_current_dir() {
local env_file
env_file="$(_termux_find_env_file 2>/dev/null)"
# Если контекст не изменился — ничего не делаем.
if [ -n "$env_file" ] && [ "$env_file" = "$_termux_env_cache" ]; then
return 0
fi
_termux_env_cache="$env_file"
# Сначала загружаем «дефолтное» окружение (опционально)
# Если файл не существует — просто пропускаем.
local default_env="$HOME/.config/termux-shell/env-scripts/default.env"
if [ -f "$default_env" ]; then
# shellcheck disable=SC1090
source "$default_env"
fi
# Затем — контекстное окружение
if [ -n "$env_file" ] && [ -f "$env_file" ]; then
# ВАЖНО: содержимое .termux-env/.envrc-termux должно быть вашим кодом.
# В примере предполагается, что там shell-совместимые команды.
# shellcheck disable=SC1090
source "$env_file"
fi
# Здесь можно дополнительно вызывать функции ресета PATH/LD_LIBRARY_PATH,
# если вы их используете в env-файлах.
}
# Хук: срабатывает при смене директории.
# В zsh используем chpwd hook.
function _termux_chpwd_hook() {
_termux_load_env_for_current_dir
}
# Добавляем хук один раз.
if [[ "$chpwd_functions" != "_termux_chpwd_hook" ]]; then
chpwd_functions+=( _termux_chpwd_hook )
fi
# Загружаем окружение при старте
_termux_load_env_for_current_dir
EOF
2) Подключение loader в ~/.zshrc
Теперь добавим подключение в ваш ~/.zshrc:
cat >> ~/.zshrc <<'EOF'
# Termux shell context loader
source "$HOME/.config/termux-shell/zsh/env_loader.zsh"
EOF
После этого перезапустите оболочку или загрузите конфигурацию:
exec zsh
3) Пример контекстного файла окружения
В корне проекта создайте .termux-env. Например:
cat > /path/to/your-project/.termux-env <<'EOF'
# Пример: окружение для проекта
export PROJECT_NAME="my-project"
# Можно задавать PATH-переопределения
export PATH="$HOME/.local/bin:$PATH"
# При необходимости можно задавать переменные для конкретных тулов
# export JAVA_HOME="$HOME/.sdkman/candidates/java/current"
EOF
Перейдите в проект — при смене директории zsh подгрузит этот файл и обновит окружение.
Автозапуск скриптов в zsh: безопасная точка входа
Частая задача — запуск сервисов или подготовка окружения при старте оболочки. Но важно сделать это предсказуемо и без «магии».
Создадим директорию автозапуска:
mkdir -p ~/.config/termux-shell/zsh/autostart.d
Соглашение: каждый файл в autostart.d будет исполняться в алфавитном порядке, если он расширяется как скрипт.
Добавим в ~/.zshrc загрузчик автозапуска:
cat >> ~/.zshrc <<'EOF'
# Termux zsh autostart (scoped and debuggable)
function _termux_run_autostart_scripts() {
local dir="$HOME/.config/termux-shell/zsh/autostart.d"
[ -d "$dir" ] || return 0
for f in "$dir"/; do
# Пропускаем, если файлов нет
[ -e "$f" ] || continue
# Исполняем только регулярные файлы
if [ -f "$f" ]; then
# Безопасный подход: запускать через bash -c не всегда нужно.
# Лучше — чтобы скрипты были самоописывающими (shebang), и выполнялись напрямую.
if [ -x "$f" ]; then
"$f"
fi
fi
done
}
_termux_run_autostart_scripts
EOF
Пример автозапуска: скрипт подготовки окружения для проекта, запускающий только один раз (по маркеру). Создайте:
cat > ~/.config/termux-shell/zsh/autostart.d/10-prepare-env <<'EOF'
#!/data/data/com.termux/files/usr/bin/env bash
marker="$HOME/.config/termux-shell/.autostart-prepare-env.done"
if [ -f "$marker" ]; then
exit 0
fi
# Например, создаём кэш-директории или проверяем наличие нужных файлов
mkdir -p "$HOME/.cache/termux-shell"
# Условные действия можно добавлять под ваш сценарий
# pkg install ... (если у вас заранее согласован workflow)
# Пишем маркер
date > "$marker"
EOF
chmod +x ~/.config/termux-shell/zsh/autostart.d/10-prepare-env
Так вы получаете автозапуск с контролем и простым откатом (удалили маркер — запустили заново).
fish: динамические профили и автозапуск
В fish контекстное переключение можно реализовать через функцию, вызываемую на смене директории, и через события. В fish удобно использовать fish_prompt или cd-обработчики, но лучше — опираться на события, которые делает fish.
1) Файл с логикой загрузки окружения
Создадим ~/.config/termux-shell/fish/env_loader.fish:
cat > ~/.config/termux-shell/fish/env_loader.fish <<'EOF'
# env_loader.fish — загрузка окружения в зависимости от текущей директории
set -g termux_env_cache ""
function termux_find_env_file
set -l dir "$PWD"
while test "$dir" != "/"; and test "$dir" != "$HOME"
if test -f "$dir/.termux-env"
echo "$dir/.termux-env"
return 0
end
if test -f "$dir/.envrc-termux"
echo "$dir/.envrc-termux"
return 0
end
set dir (dirname "$dir")
end
return 1
end
function termux_load_env
set -l env_file (termux_find_env_file 2>/dev/null)
if test -n "$env_file"; and test "$env_file" = "$termux_env_cache"
return 0
end
set -g termux_env_cache "$env_file"
# default env
set -l default_env "$HOME/.config/termux-shell/env-scripts/default.env"
if test -f "$default_env"
source "$default_env"
end
# context env
if test -n "$env_file"; and test -f "$env_file"
# Контекстный файл в fish может содержать fish-совместимый синтаксис.
source "$env_file"
end
end
# Запуск при старте
termux_load_env
EOF
2) Подключение в config fish и реакция на смену директории
fish обычно использует ~/.config/fish/config.fish. Добавим туда подключение и объявим обработчик смены директории.
Сначала добавим подключение:
touch ~/.config/fish/config.fish
grep -q "termux-shell env_loader" ~/.config/fish/config.fish || cat >> ~/.config/fish/config.fish <<'EOF'
# termux-shell env_loader
source "$HOME/.config/termux-shell/fish/env_loader.fish"
EOF
Теперь добавим обработчик на событие fish (вариант — запускать при каждом выполнении команды cd, но событие надёжнее).
В fish нет «универсального» хука именно на cd во всех версиях одинаково, поэтому практичный подход — создать функцию cd, которая вызывает оригинальное поведение и затем перезагружает окружение. Добавьте в config.fish:
cat >> ~/.config/fish/config.fish <<'EOF'
# Override cd to reload fish env on directory change
function cd
builtin cd $argv
termux_load_env
end
EOF
Перезапустите fish:
exec fish
fish: пример контекстного файла
Для fish контекстный файл должен быть fish-совместимым. Пример /path/to/project/.termux-env:
cat > /path/to/your-project/.termux-env <<'EOF'
# Пример окружения для fish
set -gx PROJECT_NAME "my-project"
# Можно изменять PATH аккуратно
set -gx PATH "$HOME/.local/bin" $PATH
EOF
Автозапуск в fish
В fish также можно организовать автозапуск через config.fish и исполняемые файлы в директории. Например:
Создадим директорию:
mkdir -p ~/.config/termux-shell/fish/autostart.d
Добавим в config.fish блок для выполнения исполняемых файлов:
cat >> ~/.config/fish/config.fish <<'EOF'
# termux-shell fish autostart
function termux_run_autostart
set -l dir "$HOME/.config/termux-shell/fish/autostart.d"
if not test -d $dir
return 0
end
for f in $dir/
if test -f $f
# исполняем только если файл исполняемый
if test -x $f
$f
end
end
end
end
termux_run_autostart
EOF
Пример скрипта автозапуска (с shebang). Создайте, например:
cat > ~/.config/termux-shell/fish/autostart.d/10-prepare-env.fish <<'EOF'
#!/usr/bin/env fish
set marker "$HOME/.config/termux-shell/.autostart-prepare-env.done"
if test -f $marker
exit 0
end
mkdir -p "$HOME/.cache/termux-shell"
date > $marker
EOF
chmod +x ~/.config/termux-shell/fish/autostart.d/10-prepare-env.fish
Динамическое переключение: практические сценарии
- Проекты с разными SDK: разные
JAVA_HOME,PATH, переменные сборки. - Разные окружения Node/Python: подхват виртуальных окружений (или путей к локальным пакетам) при входе в папку.
- Кастомные переменные для сборки: например,
BUILD_PROFILEили флаги компилятора. - Локальные сервисы: автозапуск фоновых скриптов, которые поднимают окружение (без привязки к обходу блокировок).
Примечание про VPN
Если вам нужен VPN, используйте его только для создания локальной сети или иных легитимных сценариев сетевого взаимодействия, а не для обхода блокировок. Настройку окружения и автозапуск сервисов лучше держать раздельно с точки зрения ответственности и безопасности.
Заключение
Тонкая настройка Termux с помощью профилей zsh и fish позволяет добиться воспроизводимого окружения: вы задаёте контекст один раз через .termux-env/.envrc-termux и получаете автоматическую подгрузку переменных при переходе по директориям. Дополнительно автозапуск через autostart.d даёт контролируемые стартовые действия без потери ясности — скрипты легко отключать, сортировать и отлаживать.
Если захотите, чтобы под ваши проекты мы собрали «готовую под ключ» схему профилей и шаблоны окружения для zsh/fish в Termux — обращайтесь в РыбинскЛАБ. Мы поможем спроектировать удобную структуру, внедрить автозапуск и настроить динамическое переключение под ваш рабочий поток.