LINUX.ORG.RU

Хуки в шелле

 


0

1

Как вам такая идея:

хуки в шелле - это скрипты, выполняемые, например, при переходе в или покидании рабочей директории.

Например, можно иметь стандартный хук - актвирование venv. Ну т.е. переходим в нужную директорию создаём там venv, а потом говорим, типа:

$ cd-hook venv venv
$ cd ~ # а оно уже деактивировало venv автоматом.
$ cd - # а теперь venv активирован.

Удобно когда например что-то кодируешь на питоне со сторнними зависимостями, но нет времени всё это опакечивать, и вообще не к месту, потому что продакшн кода и нет пока, чисто эктперименты. Особенно если эксперименты удаленно по SSH, и «потерять bash процесс» проще простого.

Второй юз-кейс - менять строку промпта в зависимости от директории.

Может, ещё есть какие-то интересные юз-кейсы?

★★★★★

Последнее исправление: seiken (всего исправлений: 1)

То есть это автоматизация сценария, при котором мы бы зашли в директорию и вручную сделали в ней . ./env.rc? Для отмены действия можно запустить дочерний процесс, в нём пошалить и потом его завершить.

Идея вполне здравая, но роль хуков не раскрыта. Кажется, было бы лучше, если действие было настолько простым, что сложная автоматизация не требовалась бы.

Я пока чаще делаю так:

% envrun go test

envrun задаёт переменные окружения и запускает свои аргументы.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от kaldeon

зашли в директорию и сделали в ней . ./env.rc?

да, причём, хуки персистентные, в контексте пользователя, т.е. не исчезают, если процесс с шеллом завершается

seiken ★★★★★
() автор топика
Последнее исправление: seiken (всего исправлений: 1)

хуки в шелле - это скрипты, выполняемые, например, при переходе в или покидании рабочей директории.

В ~/.bashrc

export PROMPT_COMMAND='
    path=/path/to/dir
    [[ $PWD == $path ]] &&
        > test_file
    [[ $OLDPWD == $path ]] &&
        rm $path/test_file
'

УМВР.

papin-aziat ★★★★★
()
Последнее исправление: papin-aziat (всего исправлений: 1)
Ответ на: комментарий от aol

А при чём тут какой-то gvm? Я про фича Шелла говорю. Вот, например, в баше есть ассоциативные массивы, но это же не значит, что их нужно во все скрипты пихать. Не нравится - не используй.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

А при чём тут какой-то gvm?

ну, примерно, при том, что там реализовано, примерно, как ты метишь.

Как это будет работать, я тебе уже показал ссылкой на их гитхаб.

Аналогично с переписыванием приглашения - попробуй для гита выводить имя текущей ветки и маркер незакоммиченных изменений. Поплюйся на тормоза и выключи. И идею свою отложи подальше - вот мой тебе совет.

aol ★★★★★
()
Ответ на: комментарий от legolegs

А не проще обустроить отдельные сессии в screen/tmux? Там ещё и баш_хистори может быть своя. legolegs

Ну надо же, не все лоровцы сейкины на всю голову, хоть кто то по людски живёт! :) Два чая legolegs-у, да с коньячком!

anonymous
()

$ cd ~ # а оно уже деактивировало venv автоматом.

$ cd - # а теперь venv активирован.

fish с VirtualFish и Auto-activation плагином такое умеет:

 ~ > which python                                                        ✔ │ pi@rpi-5 │ 15:25:47
/usr/bin/python

 ~ > cd Work/                                                            ✔ │ pi@rpi-5 │ 15:25:57
 ~/Work > which python                          ✔ │ pi@rpi-5 │ 🐍 3.11.2 (InfoScreen) │ 15:26:02
/home/pi/.virtualenvs/InfoScreen/bin/python

 ~/Work > cd ..                                 ✔ │ pi@rpi-5 │ 🐍 3.11.2 (InfoScreen) │ 15:26:03
 ~ > which python                                                        ✔ │ pi@rpi-5 │ 15:26:05
/usr/bin/python

 ~ >                                                                     ✔ │ pi@rpi-5 │ 15:26:07

Второй юз-кейс - менять строку промпта в зависимости от директории.

На что менять ? В современных интерактивных шеллах она давно уже искаропки сама меняется

alx777 ★★
()

Всё, что кроме промпта, делает только хуже. venv неспроста явно активируется, под ним можно уйти в другой каталог, и там запустить к примеру модуль существующий в венве.

neumond
()

подозреваю, что это способ создать геморрой. когда ты забудешь про эти неявные вызовы где-то, а они отработают. или, ещё хуже, на чужом сервере ты это установишь, а потом другой юзер зайдёт и поймает неслабые галюны от твоих настроек. любые такие вещи лучше вызывать явно, во избежание.

Iron_Bug ★★★★★
()

ну да, я пользуюсь таким, zsh-autoenv. Чтобы активировать venv в нужных мне проектах, устанавливать нужную JAVA_HOME и т.п.

Так как я пользуюсь этим в git-репах с worktree, которые удаляю после мержа веток, то проблем с «поставил хук, забыл о нём, через месяц вернулся туда же и получил неожиданные результаты» не возникает.

Lrrr ★★★★★
()