รันสคริปต์ในการเข้าสู่ระบบโดยใช้ ~ / .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
Gino Sullivan

1
chmod +x .bash_login
Zoke

1
ไม่จำเป็นต้องchmod +x .bash_login(ตั้งค่าบิตที่สามารถเรียกใช้งานได้บน. bash_login) คู่มือ Bash ค่อนข้างสับสนในพื้นที่นี้ แต่ Bash ไม่ได้ eXecute .bash_login เหมือนเชลล์สคริปต์ มันจะอ่านไฟล์แล้วดำเนินการคำสั่งภายใน (คุณสามารถทำสิ่งที่คล้ายกันโดยการเรียกใช้source ~/.bash_login)
Stefan Lasiewski

คำตอบ:


20

หาก. bash_profile มีอยู่แล้ว Bash จะไม่อ่าน. bash_login (หรือ. profile) คุณสมบัติที่น่ารำคาญนี้ได้อธิบายไว้ในคู่มือ Bash บางเวอร์ชัน แต่ไม่ทั้งหมด

.bash_profileและ.bash_loginเป็นแบบอะนาล็อกดังนั้นฉันขอแนะนำให้คุณใส่คำสั่งของคุณ.bash_profileเพราะมันเป็นที่ใช้กันทั่วไปและไม่.bash_loginเป็นที่รู้จัก นอกจากนี้ยังพิจารณาวางคำสั่งของคุณในแทน.bashrc .bash_profileคู่มืออธิบายความแตกต่างระหว่าง "เชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบ" และ "เชลล์การเข้าสู่ระบบแบบโต้ตอบ" ดังนั้นโปรดอ่านหัวข้อนั้น

คู่มืออ้างอิง GNU Bash เวอร์ชัน 4.1: ไฟล์ Bash Startupพูดว่า:

ค้นหา ~ / .bash_profile, ~ / .bash_login และ ~ / .profile ตามลำดับนั้นแล้วอ่านและดำเนินการคำสั่งจากคำสั่งแรกที่มีอยู่ และอ่านได้

โปรดดูคำถามนี้เกี่ยวกับ superuserและBash นี้ด้วย (อย่าได้รับการขัดขวางโดยที่อยู่ freeunix.dyndns.org:8088 --- มันยังเป็นคู่มือคุณภาพดีและฉันใช้มาหลายปีแล้ว)

อัปเดตเนื่องจากคุณบอกว่าคุณไม่มี. bash_profile

ดูเหมือนว่าคุณไม่ได้ใช้สิ่งที่เรียกว่า "เชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบ" (ดูคู่มือ Bash สำหรับคำอธิบายโดยละเอียด)

การทดสอบนี้เพิ่มสิ่งที่ต้องการแต่ละไฟล์ต่อไปนี้: .bashrc, และ.bash_profile.bash_login

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

จากนั้นออกจากระบบและลงชื่อเข้าใช้อีกครั้ง เมื่อคุณเข้าสู่ระบบฉันเดิมพันว่าคุณจะเห็นวลี "DEBUG: I am .bashrc" แต่ไม่ใช่ "I am .bash_profile" ถ้าเป็นเช่นนั้นก็หมายความว่าคุณเป็น "เปลือกที่ไม่ได้เข้าสู่ระบบแบบโต้ตอบ" ซึ่งก็หมายความว่าทุบตีจะเรียกแต่ไม่.bashrc .bash_profileสำหรับข้อมูลว่าทำไม dotfiles เหล่านี้เป็นอย่างที่เป็นอยู่ให้ดูที่ @Andrejs Cainikovs โพสต์ด้านล่างและhttp://mywiki.wooledge.org/DotFiles


ฉันอัปเดตคำถามของฉันฉันไม่มี bash_profile
Gino Sullivan

ตกลงเพราะก่อนหน้านี้คุณพูดว่า "ใช่ฉันมีประวัติทุบตี"
Stefan Lasiewski

ใช่ฉันมีมันแล้วลบออก แต่ผลลัพธ์เดียวกัน
Gino Sullivan

3
คำตอบนี้แก้ปัญหาได้ฉันคิดว่ามันคุ้มค่าที่จะยอมรับมัน
Marius Butuc

1
นอกจากนี้โปรดทราบว่าไฟล์ bash เหล่านี้จะทำงานเฉพาะเมื่อเข้าสู่เชลล์ (ผ่าน Terminal, ssh, ฯลฯ ) ไม่ใช่เมื่อเข้าสู่ GUI!
mivk

6

ล็อกอินเชลล์โดยไม่คำนึงถึงว่าพวกเขาเป็นแบบโต้ตอบหรือไม่โต้ตอบอ่านและดำเนินการ.profile

เปลือกหอยอินเตอร์แอคที.bashrcอ่านและดำเนินการ

บ่อยครั้งที่คุณจะเห็น/etc/profileแหล่งที่มา.bashrc- ดังนั้นการตั้งค่าทั้งหมด.bashrcจะมีผลในเชลล์ล็อกอินโดยไม่คำนึงว่ามันเป็นแบบโต้ตอบหรือไม่โต้ตอบ

ลำดับของการดำเนินการของสคริปต์การเริ่มต้นสำหรับเชลล์จะขึ้นอยู่กับว่าเชลล์นั้นเป็นแบบโต้ตอบหรือไม่แบบโต้ตอบและไม่เกี่ยวข้องกับว่าเป็นสคริปต์การเข้าสู่ระบบหรือไม่

เมื่อทุบตีถูกเรียกเป็นเปลือกเข้าสู่ระบบแบบโต้ตอบ/etc/profileมันอ่านและคำสั่งรันจาก จากนั้น Bash จะพยายามดำเนินการเฉพาะไฟล์แรกที่มีอยู่และสามารถอ่านได้ดังต่อไปนี้:

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

หากพบหนึ่งในไฟล์เหล่านี้ แต่ไม่สามารถอ่านได้มันจะทำให้เกิดข้อผิดพลาด ไม่มีข้อผิดพลาดหากไม่พบ

กระบวนการเดียวกันนี้จะถูกติดตามเมื่อมีการเรียกใช้เชลล์การล็อกอินที่ไม่โต้ตอบกับ--loginตัวเลือก


1
AFAIK .profileไฟล์จะอ่านและดำเนินการเฉพาะเมื่อผู้ใช้ล็อกอินโดยใช้ส่วนต่อประสานกราฟิก มิฉะนั้นจะไม่ได้อ่าน
RajaRaviVarma

@RajaRaviVarma ฉันเพิ่งทดสอบ (Ubuntu 16.04) และ~/.profileแน่นอนอ่านในเปลือกเข้าสู่ระบบที่ไม่ใช่กราฟิก (ฉันทดสอบโดยสลับไปยังเทอร์มินัลอื่นผ่านCtrl+Alt+F2และเข้าสู่ระบบที่นั่น)
วาลดีริอัส

ฉันเห็นด้วยกับ @RajaRaviVarma - ฉันลงชื่อเข้าใช้ Ubuntu 16.04 VM ผ่าน SSH และ.profileไม่ได้อ่านเท่านั้น.bashrc
jamesc

0

ตรวจสอบให้แน่ใจว่าสคริปต์ที่คุณต้องการเรียกใช้นั้นทำงานได้ วิ่งchmod +x scriptnameไปทำอย่างนั้น ตรวจสอบให้แน่ใจด้วยว่าสคริปต์เริ่มต้นด้วย shebang ที่ถูกต้อง ( #!/bin/bashสำหรับเชลล์สคริปต์) สุดท้ายใช้เส้นทางแบบเต็มทั้งหมดเมื่อดำเนินการเช่น/usr/bin/echoแทนที่จะใส่echoเพียงแค่สภาพแวดล้อมที่สคริปต์ของคุณจะทำงานจะไม่เหมือนกับเส้นทางที่คุณคุ้นเคย


0

Bash จะค้นหา.bash_loginหรือ.profileไฟล์เฉพาะเมื่อมันถูกเรียกใช้งานเป็นเชลล์ล็อกอินแบบโต้ตอบ .bashrcเมื่อได้มีการดำเนินการเป็นเปลือกที่ไม่ได้เข้าสู่ระบบแบบโต้ตอบมันอ่าน
โดยทั่วไปจะเป็นกรณีที่สองคือเมื่อคุณเรียกใช้gnome-terminalbash จะทำงานเป็นเปลือกที่ไม่ได้เข้าสู่ระบบ

สิ่งนี้ระบุอย่างชัดเจนว่าหากคุณกำลังบูตเข้า Gnome .bash_loginจะไม่ถูกดำเนินการ แต่ถ้าคุณลดระดับการรันเพื่อบูตโดยตรงไปยัง bash ไฟล์เดียวกันจะถูกเรียกใช้เมื่อเข้าสู่ระบบสำเร็จ
ฉันคิดว่า.bash_loginจะถูกดำเนินการในกรณีของการเชื่อมต่อ SSH ระยะไกลเช่นกัน

ฉีกจากที่นี่เป็นส่วนหนึ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.