Chạy tập lệnh khi đăng nhập bằng ~ / .bash_login


14

Tôi cần chạy tập lệnh khi đăng nhập và đăng xuất trong Ubuntu.

Tôi đã cố gắng đưa kịch bản vào ~/.bash_loginnhưng nó không hoạt động.

Có vị trí nào tốt hơn để tôi có thể chạy tập lệnh của mình không?

Kịch bản của tôi được đặt trong /home/gsd/script/login.shvà nó có thể thực thi được.

biên tập:

tập lệnh của tôi chạy khi tôi gõ: /home/gsd/script/login.shvà nó được đặt bằng + x

Bây giờ, tôi chỉ có: touch /home/gsd/test.txttrong ~/.bash_loginbài kiểm tra.

tệp test.txt không bao giờ được tạo

chỉnh sửa 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 có quyền không? ls -l .bash_login trả về cái gì?
santiagozky

Bạn cũng có một ~/.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
Không cần thiết chmod +x .bash_login(đặt bit thực thi trên .bash_login). Hướng dẫn Bash là một chút khó hiểu trong lĩnh vực này, nhưng Bash không eXecute .bash_login như một tập lệnh shell. Nó đọc tệp và sau đó thực thi các lệnh bên trong nó (Bạn có thể làm điều gì đó tương tự bằng cách chạy source ~/.bash_login).
Stefan Lasiewski

Câu trả lời:


20

Nếu .bash_profile tồn tại, thì Bash sẽ không đọc .bash_login (hoặc .profile). Tính năng gây phiền nhiễu này được mô tả trong một số phiên bản của hướng dẫn Bash, nhưng không phải tất cả.

.bash_profile.bash_logintương tự nhau, vì vậy tôi khuyên bạn nên đặt các lệnh của mình vào .bash_profilevì nó thường được sử dụng và .bash_logintương đối không rõ. Cũng xem xét đưa các lệnh của bạn vào .bashrcthay vì .bash_profile. Hướng dẫn mô tả sự khác biệt giữa "vỏ không đăng nhập tương tác" và "vỏ đăng nhập tương tác", vì vậy hãy chắc chắn đọc phần đó.

Hướng dẫn tham khảo GNU Bash phiên bản 4.1: Bash Startup Files cho biết:

tìm kiếm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, đọc và thực thi các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được.

Cũng xem câu hỏi này trên superuser , và Bash howto này (Đừng bị răn đe bởi địa chỉ freeunix.dyndns.org:8088 --- nó vẫn là một hướng dẫn chất lượng tốt và tôi đã sử dụng nó trong nhiều năm).

Cập nhật , vì bạn nói rằng bạn không có .bash_profile.

Có vẻ như bạn không sử dụng cái gọi là "vỏ không đăng nhập tương tác" (Xem hướng dẫn Bash để biết mô tả chi tiết).

Để kiểm tra điều này, thêm một cái gì đó giống như mỗi tập tin sau đây: .bashrc, .bash_profile.bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Sau đó đăng xuất và đăng nhập lại. Khi bạn đăng nhập, tôi cá là bạn sẽ chỉ thấy cụm từ "DEBUG: Tôi là .bashrc" chứ không phải "Tôi là .bash_profile". Nếu vậy, điều đó có nghĩa là bạn là một "vỏ không đăng nhập tương tác", điều đó chỉ có nghĩa là Bash sẽ gọi .bashrcnhưng không .bash_profile. Để biết thông tin tại sao các dotfiles này là như vậy, hãy xem bài đăng của @Andrejs Cainikovs bên dưới và http://mywiki.wooledge.org/DotFiles


tôi đã cập nhật câu hỏi của mình, tôi không có bash_profile
Gino Sullivan

Ok, bởi vì trước đó bạn đã nói "vâng tôi có một hồ sơ bash".
Stefan Lasiewski

vâng, tôi đã có nó sau đó loại bỏ nó nhưng kết quả tương tự
Gino Sullivan

3
Câu trả lời này giải quyết vấn đề, tôi nghĩ rằng nó đáng để chấp nhận nó.
Marius Butuc

1
Cũng lưu ý rằng các tệp bash này chỉ được chạy khi đăng nhập vào trình bao (thông qua Terminal, ssh, v.v.), không phải khi đăng nhập vào GUI!
mivk

5

Các shell đăng nhập, bất kể chúng có tương tác hay không tương tác, hãy đọc và thực thi.profile

Vỏ tương tác đọc và thực hiện .bashrc.

Thường thì bạn sẽ thấy /etc/profilecác nguồn .bashrcđó - do đó, tất cả các cài đặt được thực hiện .bashrccũng sẽ có hiệu lực trong vỏ đăng nhập bất kể đó là tương tác hay không tương tác.

Thứ tự thực hiện các tập lệnh khởi tạo cho trình bao phụ thuộc vào việc trình bao có tương tác hay không tương tác và không liên quan đến việc nó có phải là tập lệnh đăng nhập hay không.

Khi bash được gọi như một vỏ đăng nhập tương tác, nó đọc và thực thi các lệnh từ /etc/profile. Sau đó Bash sẽ thử để thực thi CHỈ tập tin đầu tiên tồn tại và có thể đọc được những điều sau đây:

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

Nếu một trong những tệp này được tìm thấy nhưng không thể đọc được, nó sẽ gây ra lỗi. Không có lỗi nếu bất kỳ KHÔNG được tìm thấy.

Quá trình tương tự này được thực hiện khi một vỏ đăng nhập không tương tác được gọi với --logintùy chọn.


1
AFAIK, .profiletệp chỉ được đọc và thực thi khi người dùng đăng nhập bằng giao diện đồ họa. Nếu không thì nó không được đọc.
RajaRaviVarma

@RajaRaviVarma Tôi mới thử nghiệm (Ubuntu 16.04) và ~/.profilechắc chắn được đọc trong các vỏ đăng nhập phi đồ họa (Tôi đã kiểm tra bằng cách chuyển sang thiết bị đầu cuối khác thông qua Ctrl+Alt+F2và đăng nhập vào đó).
waldyrious

Tôi đồng ý với @RajaRaviVarma - Tôi đang đăng nhập vào máy ảo Ubuntu 16.04 qua SSH và .profilekhông được đọc, chỉ.bashrc
jamesc

0

Hãy chắc chắn rằng tập lệnh bạn muốn chạy là có thể thực thi được. Chạychmod +x scriptname để làm điều đó. Cũng đảm bảo rằng tập lệnh bắt đầu với shebang chính xác ( #!/bin/bashđối với tập lệnh shell). Cuối cùng, sử dụng tất cả các đường dẫn đầy đủ khi thực hiện nó, ví dụ, /usr/bin/echothay vì echochỉ tạo ra môi trường mà tập lệnh của bạn sẽ thực thi không giống với môi trường mà bạn đã quen.


0

Bash chỉ tìm kiếm .bash_login hoặc .profiletập tin nếu nó được thực thi như vỏ đăng nhập tương tác. Khi nó được thực thi như là vỏ không đăng nhập tương tác, nó đọc .bashrc.
Thông thường đó là trường hợp thứ hai, tức là khi bạn chạy gnome-terminalbash được chạy dưới dạng shell không đăng nhập.

Điều này nói rõ rằng nếu bạn đang khởi động vào Gnome, .bash_login sẽ không được thực thi. Nhưng nếu bạn hạ runlevel để khởi động trực tiếp vào bash, cùng một tệp sẽ được thực hiện khi đăng nhập thành công.
Tôi giả sử .bash_loginsẽ được thực hiện trong trường hợp kết nối SSH từ xa.

Một phần bị xé toạc từ đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.