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


15

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

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

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

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

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

мой скрипт запускается, когда я печатаю: /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

У .bash_login есть необходимые разрешения? что возвращает ls -l .bash_login?
Сантьягоски

У тебя тоже есть ~/.bash_profile?
энзотиб

-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
Джино Салливан

1
chmod +x .bash_login
Зоке

1
В этом нет необходимости chmod +x .bash_login(установите исполняемый бит на .bash_login). Руководство по Bash немного запутано в этой области, но Bash не выполняет eXecute .bash_login, как скрипт оболочки. Он читает файл и затем выполняет команды внутри него (вы можете сделать что-то подобное, запустив source ~/.bash_login).
Стефан Ласевски

Ответы:


20

Если .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


я обновил свой вопрос, у меня нет bash_profile
Джино Салливан

Хорошо, потому что раньше вы сказали "да, у меня есть профиль bash".
Стефан Ласевский

да, у меня было это тогда удалило это, но те же самые результаты
Джино Салливан

3
Этот ответ решает проблему, я думаю, что это стоит принять.
Мариус Бутук

1
Также обратите внимание, что эти файлы bash запускаются только при входе в оболочку (через Terminal, ssh и т. Д.), А не при входе в GUI!
Mivk

6

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

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

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

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

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

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

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

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


1
AFAIK, .profileфайл читается и выполняется только тогда, когда пользователь входит в систему с помощью графического интерфейса. В противном случае это не читается.
RajaRaviVarma

@RajaRaviVarma Я только что протестировал (Ubuntu 16.04) и ~/.profileопределенно читается в неграфических оболочках входа в систему (я проверял, переключаясь на другой терминал через Ctrl+Alt+F2и входя в систему там).
Waldyrious

Я согласен с @RajaRaviVarma - я вхожу в виртуальную машину Ubuntu 16.04 через SSH и .profileне только для чтения.bashrc
jamesc

0

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


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.