238 lines
10 KiB
Go
238 lines
10 KiB
Go
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<Tab> → git checkout
|
||
ls /etc/sy<Tab> → ls /etc/systemd/
|
||
ssh us<Tab> → ssh user@hostname (из ~/.ssh/config)
|
||
systemctl st<Tab> → 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()
|
||
}
|