Запустіть скрипт при вході за допомогою ~ / .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?
santiagozky

У вас теж є ~/.bash_profile?
enzotib

-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 у такому порядку та читає та виконує команди з першого, що існує та читається.

Також дивіться це питання про суперпользователя , і це хауз Баша (Не відлякуйте адресою 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
Gino Sullivan

Добре, тому що раніше ви говорили "так, у мене є баш-профіль".
Стефан Ласєвський

так, у мене було це видалено, але такі ж результати
Джино Салліван

3
Ця відповідь вирішує проблему, я думаю, варто її прийняти.
Маріус Бутук

1
Також зауважте, що ці файли bash запускаються лише при вході в оболонку (через термінал, ssh тощо), а не при вході в графічний інтерфейс!
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 VM через 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він не буде виконаний. Але якщо ви знизите runlevel для завантаження безпосередньо до bash, той самий файл буде виконаний при успішному вході.
Я припускаю, що .bash_loginбуде виконано і у випадку віддалених підключень SSH.

Частково вирваний звідси .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.