package linuxmodules import ( "fmt" "rubric/utils" ) var BashModule = Module{ Key: "bash", Aliases: []string{"sh", "shell", "баш"}, Title: "Bash: основы и переменные", Description: "Темы 12–13: bash-completion, alias, type, переменные окружения", Run: showBash, } func showBash() { utils.Header("Linux — Bash: основы и переменные") // ─── 12. Bash #1 ────────────────────────────────────────────── utils.Section("12. Bash #1: bash-completion, alias, type") utils.Println(utils.ColorBold + "bash-completion — автодополнение Tab:" + utils.ColorReset) utils.Code(`Tab — дополнить команду / путь / аргумент Tab Tab — показать все варианты # Примеры: git che → git checkout ls /etc/sy → ls /etc/systemd/ ssh us → ssh user@hostname (из ~/.ssh/config) systemctl st → systemctl start/status/stop # Установить расширенный bash-completion: # Debian/Ubuntu: apt install bash-completion # RHEL/Fedora: dnf install bash-completion # Активировать в ~/.bashrc: [ -f /etc/bash_completion ] && . /etc/bash_completion`) utils.Println(utils.ColorBold + "alias — псевдонимы команд:" + utils.ColorReset) utils.Code(`# Посмотреть все алиасы: alias # Создать алиас (действует до конца сессии): alias ll='ls -la' alias la='ls -la' alias ..='cd ..' alias ...='cd ../..' alias grep='grep --color=auto' alias rm='rm -i' # защита от случайного удаления alias df='df -h' alias free='free -h' alias update='sudo apt update && sudo apt upgrade' # Использование алиаса: ll /etc # Удалить алиас: unalias ll # Посмотреть что делает алиас: alias ll`) utils.Println(utils.ColorBold + "Постоянные алиасы — добавить в ~/.bashrc:" + utils.ColorReset) utils.Code(`# ~/.bashrc alias ll='ls -la --color=auto' alias la='ls -la' alias l='ls -CF' alias ..='cd ..' alias grep='grep --color=auto' alias h='history' alias c='clear' # Применить без перезапуска терминала: source ~/.bashrc # или: . ~/.bashrc`) utils.Println(utils.ColorBold + "type — определить тип команды:" + utils.ColorReset) utils.Code(`type ls # ls is aliased to 'ls --color=auto' type cd # cd is a shell builtin type python3 # python3 is /usr/bin/python3 type ll # ll is aliased to 'ls -la' type if # if is a shell keyword # Опции: type -a ls # все варианты (алиас + файл) type -t ls # только тип: alias/builtin/file/keyword`) utils.Println(utils.ColorBold + "which и whereis:" + utils.ColorReset) utils.Command("which python3", "полный путь к исполняемому файлу") utils.Command("which -a python", "все версии python в PATH") utils.Command("whereis nginx", "бинарник, исходники, man-страница") utils.Command("command -v git", "путь или алиас (POSIX-совместимо)") fmt.Println() utils.Println(utils.ColorBold + "Работа с историей команд:" + utils.ColorReset) utils.Command("history", "полная история") utils.Command("history 20", "последние 20 команд") utils.Command("!42", "выполнить команду №42") utils.Command("!!", "повторить последнюю команду") utils.Command("!ls", "последняя команда начинающаяся с ls") utils.Command("Ctrl+R", "интерактивный поиск по истории") utils.Command("history -c", "очистить историю") fmt.Println() utils.Code(`# Файл истории: ~/.bash_history # Управление историей через переменные в ~/.bashrc: HISTSIZE=10000 # размер в памяти HISTFILESIZE=20000 # размер файла HISTCONTROL=ignoredups # не сохранять дубли HISTCONTROL=ignorespace # команды с пробелом впереди не сохраняются # Временные метки в истории: HISTTIMEFORMAT="%F %T "`) // ─── 13. Bash #2: переменные ────────────────────────────────── utils.Section("13. Bash #2: переменные") utils.Println(utils.ColorBold + "Переменные оболочки:" + utils.ColorReset) utils.Code(`# Создать переменную: name="Alice" # без пробелов вокруг = count=42 PATH_BACKUP=$PATH # использовать значение другой переменной # Использовать переменную ($ перед именем): echo $name # Alice echo "Привет, $name!" # Привет, Alice! echo "Привет, ${name}!" # фигурные скобки — явное обозначение # Удалить переменную: unset name`) utils.Println(utils.ColorBold + "Переменные окружения (Environment Variables):" + utils.ColorReset) utils.Code(`# Переменные оболочки vs переменные окружения: # - переменная оболочки видна только в текущем shell # - переменная окружения (export) передаётся дочерним процессам # Экспортировать: export name="Alice" export PATH="$PATH:/opt/myapp/bin" # Или сразу: export count=42 # Посмотреть все переменные окружения: env printenv printenv PATH # конкретная переменная echo $PATH # то же`) utils.Println(utils.ColorBold + "Важные системные переменные:" + utils.ColorReset) utils.Code(`PATH — список директорий для поиска команд (: разделитель) /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin HOME — домашняя директория (~) /home/alice USER — имя пользователя alice LOGNAME — логин пользователя alice SHELL — оболочка пользователя /bin/bash TERM — тип терминала xterm-256color LANG — язык/локаль en_US.UTF-8 LC_ALL — переопределить все локали PWD — текущая директория /home/alice/docs OLDPWD — предыдущая директория PS1 — приглашение командной строки PS2 — вторичное приглашение (>) EDITOR — редактор по умолчанию vim VISUAL — визуальный редактор vim PAGER — пагинатор less HISTSIZE — размер истории в памяти RANDOM — случайное число 0-32767`) utils.Println(utils.ColorBold + "Специальные переменные bash:" + utils.ColorReset) utils.Code(`$0 — имя скрипта / оболочки $1..$9 — позиционные параметры (аргументы скрипта) $@ — все аргументы как отдельные строки $* — все аргументы как одна строка $# — количество аргументов $? — код возврата последней команды (0 = успех) $$ — PID текущего процесса $! — PID последнего фонового процесса $_ — последний аргумент предыдущей команды`) utils.Code(`# Примеры: echo $? # 0 если последняя команда успешна ls /nonexistent echo $? # 2 (или другой ненулевой) — ошибка echo $$ # PID bash echo $RANDOM # случайное число`) utils.Println(utils.ColorBold + "Работа со строками переменных:" + utils.ColorReset) utils.Code(`name="alice" ${name} → alice ${name^} → Alice (первая буква заглавная) ${name^^} → ALICE (все заглавные) ${name,,} → alice (все строчные) str="hello world" ${#str} → 11 (длина строки) ${str:0:5} → hello (подстрока с 0, длиной 5) ${str:6} → world (с позиции 6 до конца) path="/home/user/file.txt" ${path##*/} → file.txt (удалить до последнего /) ${path%/*} → /home/user (удалить от последнего /) ${path%.*} → /home/user/file (удалить расширение) ${path##*.} → txt (только расширение) # Значения по умолчанию: ${var:-default} → default если var не задана или пустая ${var:=default} → присвоить и вернуть default если пустая ${var:?ошибка} → вывести ошибку если пустая`) utils.Println(utils.ColorBold + "Настройка ~/.bashrc и ~/.bash_profile:" + utils.ColorReset) utils.Code(`~/.bashrc — выполняется при каждом запуске интерактивного bash ~/.bash_profile — выполняется при входе в систему (login shell) ~/.profile — POSIX-совместимый аналог .bash_profile ~/.bash_logout — выполняется при выходе # Типичный ~/.bashrc: export PATH="$HOME/.local/bin:$PATH" export EDITOR=vim alias ll='ls -la' alias ..='cd ..' # ~/.bash_profile обычно вызывает ~/.bashrc: [[ -f ~/.bashrc ]] && . ~/.bashrc # Применить изменения без перезапуска: source ~/.bashrc`) utils.Footer() }