Jalankan skrip saat masuk menggunakan ~ / .bash_login

14

Saya perlu menjalankan skrip ketika saya masuk dan keluar di Ubuntu saya.

Saya mencoba memasukkan skrip ke dalam skrip saya ~/.bash_logintetapi tidak berhasil.

Apakah ada lokasi yang lebih baik untuk menjalankan skrip saya?

Script saya terletak di /home/gsd/script/login.shdan dapat dieksekusi.

edit:

skrip saya berjalan saat saya mengetik: /home/gsd/script/login.shdan diset dengan + x

sekarang, saya hanya punya: touch /home/gsd/test.txtdi ~/.bash_loginuntuk menguji.

file test.txt tidak pernah dibuat

edit 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
Gino Sullivan
sumber
apakah .bash_login memiliki izin yang benar? apa yang dikembalikan ls-l .bash_login?
santiagozky
Anda juga punya ~/.bash_profile?
enzotib
-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
Gino Sullivan
1
chmod +x .bash_login
Zoke
1
Tidak perlu chmod +x .bash_login(atur bit yang dapat dieksekusi pada .bash_login). Manual Bash agak membingungkan di area ini, tetapi Bash tidak eXecute .bash_login seperti skrip shell. Itu membaca file dan kemudian menjalankan perintah di dalamnya (Anda dapat melakukan sesuatu yang serupa dengan menjalankan source ~/.bash_login).
Stefan Lasiewski

Jawaban:

20

Jika .bash_profile ada, maka Bash tidak akan membaca .bash_login (atau .profile). Fitur yang mengganggu ini dijelaskan dalam beberapa versi manual Bash, tetapi tidak semua.

.bash_profiledan .bash_loginanalog, jadi saya sarankan Anda memasukkan perintah Anda .bash_profile, karena ini umum digunakan dan .bash_loginrelatif tidak dikenal. Juga pertimbangkan untuk menempatkan perintah Anda .bashrcsebagai gantinya .bash_profile. Manual ini menjelaskan perbedaan antara "shell non-login interaktif" dan "shell login interaktif", jadi pastikan untuk membaca bagian itu.

Manual Referensi Bash GNU versi 4.1: Bash Startup Files mengatakan:

mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca.

Lihat juga pertanyaan ini pada superuser , dan Bash howto ini (Jangan terhalang oleh alamat freeunix.dyndns.org:8088 --- ini masih merupakan manual yang berkualitas baik dan saya telah menggunakannya selama bertahun-tahun).

Perbarui , karena Anda mengatakan Anda tidak memiliki .bash_profile.

Sepertinya Anda tidak menggunakan apa yang disebut "shell non-login interaktif" (Lihat manual Bash untuk deskripsi terperinci).

Untuk menguji ini, menambahkan sesuatu seperti berikut setiap file: .bashrc, .bash_profiledan .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Kemudian keluar dan masuk lagi. Saat Anda masuk, saya yakin Anda hanya akan melihat frasa "DEBUG: I .bashrc" tetapi bukan "I .bash_profile". Jika demikian, itu berarti Anda adalah "shell non-login interaktif", yang berarti bahwa Bash akan memanggil .bashrctetapi tidak .bash_profile. Untuk informasi mengapa dotfile seperti ini, lihat posting @Andrejs Cainikovs di bawah ini dan http://mywiki.wooledge.org/DotFiles

Stefan Lasiewski
sumber
saya memperbarui pertanyaan saya, saya tidak punya bash_profile
Gino Sullivan
Ok, karena sebelumnya kamu bilang "iya aku punya profil bash".
Stefan Lasiewski
ya, saya sudah menghapusnya tetapi hasilnya sama
Gino Sullivan
3
Jawaban ini menyelesaikan masalah, saya pikir layak menerimanya.
Marius Butuc
1
Perhatikan juga bahwa file-file bash ini hanya dijalankan ketika masuk ke shell (melalui Terminal, ssh, dll.), Bukan ketika masuk ke GUI!
mivk
5

Shell login, terlepas dari apakah mereka interaktif atau non-interaktif, baca dan jalankan.profile

Kerang interaktif membaca dan mengeksekusi .bashrc.

Seringkali Anda akan melihat /etc/profilesumber itu .bashrc- sehingga semua pengaturan yang dibuat .bashrcjuga akan berlaku di shell login terlepas dari apakah itu interaktif atau non-interaktif.

Urutan eksekusi skrip inisialisasi untuk shell tergantung pada apakah shell itu interaktif atau non-interaktif dan tidak terkait dengan apakah itu script login atau tidak.

Ketika bash dipanggil sebagai shell login interaktif, ia membaca dan mengeksekusi perintah dari /etc/profile. Kemudian Bash kemudian akan mencoba untuk menjalankan HANYA file pertama ada dan dapat dibaca sebagai berikut:

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

Jika salah satu dari file ini ditemukan tetapi tidak dapat dibaca, itu akan menyebabkan kesalahan. Tidak ada kesalahan jika ada yang TIDAK ditemukan.

Proses yang sama diikuti ketika shell login non-interaktif dipanggil dengan --loginopsi.

jwilleke
sumber
1
AFAIK, .profilefile dibaca dan dieksekusi hanya ketika pengguna masuk menggunakan antarmuka grafis. Kalau tidak, itu tidak dibaca.
RajaRaviVarma
@RajaRaviVarma Saya baru saja menguji (Ubuntu 16.04) dan ~/.profilepasti dibaca dalam shell login non-grafis (Saya diuji dengan beralih ke terminal lain melalui Ctrl+Alt+F2dan masuk di sana).
waldyrious
Saya setuju dengan @RajaRaviVarma - Saya masuk ke Ubuntu 16.04 VM melalui SSH dan .profiletidak dibaca, hanya.bashrc
jamesc
0

Pastikan skrip yang ingin Anda jalankan dapat dieksekusi. Jalankan chmod +x scriptnameuntuk melakukan itu. Pastikan juga skrip dimulai dengan shebang yang benar ( #!/bin/bashuntuk skrip shell). Terakhir, gunakan semua path lengkap ketika mengeksekusinya, misalnya, /usr/bin/echoalih-alih echohanya memetikan lingkungan yang akan dieksekusi skrip Anda tidak identik dengan yang Anda gunakan sebelumnya.

Huckle
sumber
0

Bash hanya mencari .bash_loginatau .profilefile jika dijalankan sebagai shell login interaktif. Ketika dijalankan sebagai shell non-login interaktif itu berbunyi .bashrc.
Biasanya ini adalah kasus kedua, yaitu ketika Anda menjalankan gnome-terminalbash dijalankan sebagai shell non-login.

Ini dengan jelas menyatakan bahwa jika Anda boot ke Gnome, .bash_logintidak akan dieksekusi. Tetapi jika Anda menurunkan runlevel untuk mem-boot langsung ke bash, file yang sama akan dijalankan setelah login berhasil.
Saya berasumsi .bash_loginakan dieksekusi jika koneksi SSH jarak jauh juga.

Sebagian robek dari sini .

Andrejs Cainikovs
sumber