Запустите скрипт при входе в систему, используя ~ / .bash_login

Мне нужно запустить скрипт, когда я вхожу и выхожу из системы в моей Ubuntu.

Я пытался вставить сценарий в свой ~/.bash_login, но он не работал.

Есть ли лучшее место, где я могу запустить свой сценарий?

Мой сценарий находится в /home/gsd/script/login.sh и он исполняемый.

edit:

мой скрипт запускается, когда я набираю: /home/gsd/script/login.sh и теперь он установлен с + x

, у меня только: touch /home/gsd/test.txt в ~/.bash_login для проверки

файл test.txt никогда не создается

редактировать 2:

gsd@laptop:~$ ll ~/.bash*
-rw------- 1 gsd gsd 38639 2012-01-25 17:25 .bash_history
-rw-r--r-- 1 gsd gsd    29 2012-01-25 15:22 .bash_login
-rw-r--r-- 1 gsd gsd   220 2011-11-03 19:22 .bash_logout
-rw-r--r-- 1 gsd gsd  3136 2011-11-04 08:00 .bashrc
14
задан 26 January 2012 в 17:15

4 ответа

Если .bash_profile существует, то Bash не будет читать .bash_login (или .profile). Эта раздражающая функция описана в некоторых версиях руководства по Bash, но не во всех.

.bash_profile и .bash_login аналогичны, поэтому я рекомендую вам поместить ваши команды в .bash_profile, потому что они обычно используются и .bash_login относительно неизвестны. Также рассмотрите возможность размещения ваших команд в .bashrc вместо .bash_profile. В руководстве описывается различие между «интерактивной оболочкой без входа в систему» ​​и «интерактивной оболочкой входа в систему», поэтому обязательно прочитайте этот раздел.

Справочное руководство по GNU Bash версии 4.1: файлы запуска Bash говорит:

ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в этот порядок, а также читает и выполняет команды из первой из существующих и доступных для чтения.

Также см. этот вопрос о суперпользователе и это Bash howto (Не останавливайтесь по адресу freeunix.dyndns.org:8088 --- это все еще руководство хорошего качества, и я использовал его в течение многих лет).

Обновление , поскольку вы говорите, что у вас нет .bash_profile.

Похоже, вы не используете так называемую «интерактивную оболочку без авторизации» (подробное описание см. В руководстве по Bash).

Чтобы проверить это, добавьте что-то вроде следующего в каждом файле: .bashrc, .bash_profile и .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Затем выйдите и войдите снова. Когда вы входите в систему, я уверен, что вы увидите только фразу «DEBUG: я .bashrc», но не «Я .bash_profile». Если это так, это означает, что вы являетесь «интерактивной оболочкой без регистрации», что просто означает, что Bash будет вызывать .bashrc, но не .bash_profile. Для получения информации о том, почему эти точечные файлы являются такими, как они есть, см. Пост @Andrejs Cainikovs ниже и http://mywiki.wooledge.org/DotFiles

0
ответ дан 26 January 2012 в 17:15

Оболочки входа в систему, независимо от того, если они - интерактивное или неинтерактивное чтение и выполняются .profile

Интерактивное чтение оболочек и выполняется .bashrc.

Часто Вы будете видеть это /etc/profile источники .bashrc - таким образом все настройки, установленные в .bashrc также вступит в силу в оболочке входа в систему независимо от того, является ли это интерактивным или неинтерактивным.

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

Когда удар вызывается как интерактивная оболочка входа в систему, он читает и выполняет команды от /etc/profile. Затем Bash затем попробует для выполнения, ТОЛЬКО первый файл существует и читаем из следующего:

  1. .bash_profile
  2. .bash_login
  3. .profile

Если один из этих файлов будет найден, но не сможет быть считан, то он вызовет ошибку. Нет никакой ошибки, если кто-либо НЕ найден.

Этот тот же процесс сопровождается, когда неинтерактивная оболочка входа в систему вызывается с --login опция.

5
ответ дан 26 January 2012 в 17:15

Bash ищет файлы .bash_login или .profile только в том случае, если он выполнен в виде интерактивной оболочки входа. Когда он выполняется как интерактивная оболочка без входа в систему, он читает .bashrc.
Обычно это второй случай, т. Е. Когда вы запускаете gnome-terminal, bash запускается как не входящая в систему оболочка.

Это ясно говорит о том, что если вы загружаетесь в Gnome, .bash_login не будет выполнен. Но если вы снизите уровень запуска для загрузки непосредственно в bash, тот же файл будет выполнен при успешном входе в систему.
Я предполагаю, что .bash_login будет выполняться и в случае удаленных SSH-соединений.

Частично разорван из здесь .

0
ответ дан 26 January 2012 в 17:15

Убедитесь, что скрипт, который вы хотите запустить, является исполняемым. Запустите chmod +x scriptname, чтобы сделать это. Также убедитесь, что сценарий начинается с правильного шебанга (#!/bin/bash для сценариев оболочки). Наконец, используйте все полные пути при его выполнении, например, /usr/bin/echo вместо echo, только если среда, в которой будет выполняться ваш скрипт, не идентична той, к которой вы привыкли.

0
ответ дан 26 January 2012 в 17:15

Другие вопросы по тегам:

Похожие вопросы: