We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Тонкая настройка профилей оболочки (zsh, fish) с динамическим переключением окружения и автозапуском скриптов

Практическое руководство по настройке Termux: zsh и fish, динамическое переключение окружения, профили по проектам и автозапуск скриптов для воспроизводимой работы на Android.

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 — обращайтесь в РыбинскЛАБ. Мы поможем спроектировать удобную структуру, внедрить автозапуск и настроить динамическое переключение под ваш рабочий поток.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект