Недавно на форуме arch linux увидел такую штуку:
export PROMPT_COMMAND='[[ $curdir != $PWD ]] && ls -a; curdir=$PWD'
при каждом входе в новую директорию автоматически вызывается ls -a.
А все дело в переменной окружения PROMPT_COMMAND - bash выполняет ее перед выводом нового приглашения. Если разобраться, можно превратить её в инструмент автоматизации.
▪️ Базовые сценарии
📍 Автолистинг при смене директории
PROMPT_COMMAND='[[ $lastdir != $PWD ]] && ls; lastdir=$PWD'
ls срабатывает только если реально поменяли директорию.
📍 Показ текущей git-ветки
PROMPT_COMMAND='branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null); PS1="[\u@\h \W${branch:+ ($branch)}]\\$ "'
приглашение (PS1) динамически обновляется: добавляет (ветка) только в репозитории.
📍Отображение количества фоновых задач
PROMPT_COMMAND='jobs_count=$(jobs -p | wc -l); PS1="[jobs:$jobs_count] \u@\h:\w\$ "'
рядом с промптом видим, сколько задач выполняется в фоне.
▪️ Продвинутые хаки
📍 Время последней команды
PROMPT_COMMAND='PS1="[\t] \u@\h:\w\$ "'
каждый раз в начале промпта вставляется текущее время.
📍 Звуковой сигнал при ошибке
PROMPT_COMMAND='[ $? -ne 0 ] && echo -ne "\a"'
если последняя команда завершилась ошибкой (exit code != 0), терминал пищит.
📍История + логирование всех команд
PROMPT_COMMAND='history -a; history -c; history -r'
история сохраняется сразу (не только при выходе из shell), что полезно при одновременных сессиях.
▪️ Комбо вариант
PROMPT_COMMAND='
[[ $lastdir != $PWD ]] && ls; lastdir=$PWD;
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null);
jobs_count=$(jobs -p | wc -l);
PS1="[jobs:$jobs_count ${branch:+git:$branch}] \u@\h:\w\$ "
'
- при смене директории автоматом делается ls
- в промпте видно количество фоновых задач
- в git-репозитории показывается текущая ветка
BashTex 📱 #bash #utils