
У меня есть аккаунты на нескольких разных машинах для тестирования пары библиотек, в которые я вношу свой вклад. Некоторые машины принадлежат другим (например, ферма компиляции GCC), и я хотел бы содержать их в порядке.
Я хочу настроить .bash_logout
скрипт, который выполняет make clean
командуexit
еслиЯ нахожусь в определенном каталоге. Требование каталога выпадает из нескольких сеансов SSH. Если я выполняю сборку/тестирование в одном сеансе, я не хочу, чтобы отдельный сеанс выходил из системы, очищая артефакты. То есть exit
from $HOME/libfoo
выполняет очистку; в то время как exit
from $HOME
— нет.
Я понимаю основы, но мне не ясно, насколько это надежно:
# $HOME/.bash_logout
if [ "$PWD" = "$HOME/libfoo" ]; then
make clean 1>/dev/null 2>&1
fi
Есть ли какие-то проблемы с использованием $PWD
во время выхода? Есть ли какие-то другие проблемы, которые я мог пропустить?
решение1
Вы намерены выполнить скрипт только при выходе из системы?
Из man bash:
При выходе из оболочки входа bash считывает и выполняет команды из файла ~/.bash_logout, если он существует.
Только при выходе из оболочки входа bash.
Если вы собираетесь запускать скрипт при каждом закрытии оболочки, используйте команду trap (см. man bash):
trap /u1/myuser/on_exit_script.sh EXIT
Добавьте его в .bashrc или какой-либо другой подходящий вам файл.
Кроме того, поскольку скрипт будет выполняться при выходе, $PWD будет активным при выходе, который может быть или не быть тем же самым, что и при запуске оболочки. Если вам нужно что-то сделать с $PWD, который использовался при выходе, то да, этот тест:
if [ "$PWD" = "$HOME/libfoo" ]; then
Должно сработать.
решение2
Мне нравятся многие из моих скриптов оболочки, которые являются переносимыми и не зависят от оболочки, поэтому я предпочитаю перехват EXIT, а не использование специфичного для bash метода .bash_logout. И для действительно автономного решения лучше не изменять и не создавать .bash_logout, и не полагаться на отдельный скрипт для запуска при выходе. И, конечно, гораздо хуже было бы изменять или переопределять то, что сама команда "exit" делает в системе - решение не должно влиять ни на кого другого!
Поэтому для минимального воздействия на чужие системы я предпочитаю метод сбрасывать пользовательский профиль входа в систему всякий раз, когда начинаю работать с системой, и очищать себя и любые вспомогательные скрипты или файлы конфигурации, которые он создает. Затем я беру этот профиль (используя "." что работает и под ksh), который настраивает все мои псевдонимы и т. д. - но я не хочу, чтобы он оставался, когда я закончу.
Поэтому я создаю функцию оболочки «bye» в самом скрипте, которая выполняет указанную очистку, и регистрирую ее для автоматической очистки при выходе из системы, будь то намеренный выход или простое отключение, с помощью:
trap bye EXIT
Это гарантирует, что я не оставлю после себя уродливых следов своей работы. Какую именно очистку он должен выполнить, решать вам, специфичная для каталога "make clean" - это всего лишь одна из многих возможностей. И как только выход из системы происходит любым способом, все следы профиля, включая даже функцию очистки, исчезают.
Вы можете пойти на шаг дальше — возможно, есть разные типы систем, на которых вы хотите, чтобы выполнялись разные типы очистки, или на некоторых системах вы вообще не хотите, чтобы выполнялась такая очистка. Вы можете встроить переключатели в функцию оболочки "bye" или сделать разные "bye1", "bye2" и зарегистрировать нужный на основе какого-то теста, например, существования какого-то файла. Вот как я предотвращаю удаление своего пользовательского профиля на системах, которые я использую долгое время, где я хочу сохранить один и тот же профиль.
решение3
Я не уверен, как это сделать через bash_logout, хотя вы можете написать небольшой скрипт под названием exit, который вы поместите в /usr/local/bin/ с таким же кодом, который вы указали в своем вопросе, так что когда вы вводите exit в консоли, он делает то, что вам нужно, если вы находитесь в определенном каталоге.