Tại sao .bashrc không tự động chạy?


202

Tôi đặt một số lệnh bí danh trong .bashrctệp của mình để chúng có thể được tải mỗi khi tôi mở cửa sổ Terminal mới. Tuy nhiên, điều này không xảy ra.

Tôi phải chọn run script:trong Terminal> Preferences> " MyDefaultTheme "> Shell prefpane và thêm: source .bashrc && clearđể nó hoạt động ...

Điều này có vẻ kỳ lạ vì nhiều hướng dẫn chỉ nói rằng bạn chỉ cần thêm vào .bashrctệp và tất cả đều tốt.

Lưu ý rằng tôi không chạy vào bashkhi sử dụng thiết bị đầu cuối, tôi thích cái khác (mặc định) (không biết nó là gì) tốt hơn, bởi vì nó cho tôi thấy tôi đang ở đâu mọi lúc, ví dụ:

>>d54c6b47b:~ romeo$

thay vì:

>>bash$

Trong bash tất cả được tải như nên được.

Vì vậy, câu hỏi của tôi là, tại sao .bashrctập tin của tôi không tải tự động và tôi phải thêm tùy chọn để gọi nó mọi lúc?

Ngoài ra một số hướng dẫn nói với tôi để làm một cái gì đó như:

$alias la=’ls -la >> ~/.bashrc

cái mà nên viết bí danh cho tôi .bashrc, cái này cũng không hoạt động ...

Lưu ý rằng tôi là người mới UNIX, vì vậy hãy nhẹ nhàng.


Tôi nghĩ rằng điều này rất gần với apple.stackexchange.com/questions/7984/ ,.
boehj

@boehj cũng đề cập đến việc "không tải .bashrc" nhưng đó là về nó.
Jari Keinänen

OK, xin lỗi nếu tôi nhầm lẫn những thứ ở đây.
boehj

Bạn có thể thích csh(hoặc một biến thể khác) tốt hơn. Nhưng bạn nên biết rằng >>bash$có thể thay đổi :)
vol7ron

Nếu bạn muốn các lệnh để chạy onload , tạo .profiletrong thư mục chính của bạn
Kolob Canyon

Câu trả lời:


94

Chỉ cần đặt nó trong .profiletệp của bạn từ thư mục nhà của bạn và nó sẽ hoạt động vào lần tiếp theo bạn bắt đầu một trình bao mới hoặc sau khi bạn chạysource ~/.profile

Liên kết này nêu rõ thứ tự các tệp khởi động được đọc và tải bởi trình bao: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup


chấp nhận điều này bởi vì nó là một giải pháp (và đó là bài đầu tiên trong số hai bài gần giống nhau).
romeovs

37
Bỏ phiếu. Tôi khuyên bạn không nên làm theo lời khuyên này. Vấn đề là Terminal tạo shell đăng nhập và shell đăng nhập Bash chỉ chạy tập lệnh khởi động đăng nhập, không phải ~/.bashrc. Tuy nhiên, giải pháp không chỉ đơn giản là đặt .bashrcnội dung của bạn vào tệp khởi động đăng nhập, bởi vì hai tệp này nhằm thực hiện các loại thiết lập khác nhau. Thay vào đó, thiết lập chính tắc cho Bash là để ~/.bash_profilenguồn của bạn ~/.bashrctại một số điểm thích hợp trong tập lệnh (thường là cuối cùng).
Chris Trang

Tôi thấy không có bài đăng giống hệt nào khác mà chỉ nói hãy đặt vào tập tin sh
Đánh dấu

218

Đã từng trải qua rồi. Những gì tôi biết, OS X không đọc .bashrctệp khi bắt đầu bash. Thay vào đó, nó đọc các tệp sau (theo thứ tự sau):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Xem thêm bình luận hữu ích và hữu ích của Chris Johnsen :

Theo mặc định, Terminal khởi động shell thông qua /usr/bin/login, điều này làm cho shell trở thành shell đăng nhập. Trên mọi nền tảng (không chỉ là Mac OS X) bash không sử dụng .bashrccho các hệ vỏ đăng nhập (chỉ /etc/profilevà là người đầu tiên của .bash_profile, .bash_login, .profiletồn tại và có thể đọc được). Đây là lý do tại sao "đưa source ~/.bashrcvào của bạn .bash_profile" là lời khuyên tiêu chuẩn

Tôi thường chỉ cần đặt những điều mà tôi thường muốn đưa vào ~/.bashrcđể ~/.profile- đã làm việc cho đến nay như một nét duyên dáng.


38
Theo mặc định, Terminal khởi động shell thông qua /usr/bin/login, điều này làm cho shell trở thành shell đăng nhập. Trên mọi nền tảng (không chỉ là Mac OS X) bash không sử dụng .bashrccho các hệ vỏ đăng nhập (chỉ /etc/profilevà là người đầu tiên của .bash_profile, .bash_login, .profiletồn tại và có thể đọc được). Đây là lý do tại sao, đưa source ~/.bashrcvào trong cuộc sống của bạn .bash_profilelà lời khuyên tiêu chuẩn.
Chris Johnsen

5
Re "Tôi thường chỉ đưa những thứ mà tôi thường đặt vào ~ / .bashrc thành ~ / .profile": Để ​​tương thích tối đa, tôi khuyên bạn nên làm theo lời khuyên của Chris Johnsen và đặt bất cứ điều gì bạn muốn áp dụng cho trình bao không đăng nhập vào ~ / .bashrc và thêm "source ~ / .bashrc" vào ~ / .bash_profile của bạn để chạy nó cho shell đăng nhập. Mặt khác, nó sẽ không hoạt động đối với các vỏ phụ hoặc nếu Terminal thay đổi để tạo các vỏ không đăng nhập hoặc nếu bạn đã từng sử dụng xterm hoặc một chương trình đầu cuối khác tạo các vỏ không đăng nhập theo mặc định hoặc nếu bạn có thể muốn sử dụng thiết lập tương tự trên hệ điều hành khác.
Chris Trang

4
Trên một lưu ý liên quan, trên Mac OS X, bạn nên xem xét việc có ~ / .bashrc chạy / etc / bashrc để chọn các hành vi toàn cầu. Cụ thể, có mã trong / etc / bashrc để cập nhật thư mục làm việc tại mỗi dấu nhắc, điều này cho phép Terminal hiển thị biểu tượng proxy, tạo các thiết bị đầu cuối mới trong cùng thư mục và khôi phục thư mục làm việc cho Resume và Window Groups.
Chris Trang

Đối với tôi, tìm nguồn cung ứng .bashrc từ .bash_profile không hoạt động. Nhưng nguồn .bashrc / .bash_profile từ .profile đã hoạt động.
Ken Russell

2
Câu trả lời tốt đẹp nhưng một chút sai lầm. Tôi tin tải terminal bash chỉ một trong những ~/.bash_profile, ~/.profile, ~/.bash_login, không bao giờ tất cả các chúng. Bạn có thể chạy thử nghiệm đơn giản bằng cách tạo 3 tệp. Dường như nhà ga bash có sự ưu đãi của ~/.bash_profile> ~/.bash_login> ~/.profile. Nếu bất cứ ai trong số họ tồn tại, những người ít ưu tiên hơn sẽ bị bỏ qua. Đó là lý do tại sao đôi khi nó được khuyến khích để còn nguồn ~/.profiletrong ~/.bash_profile.
thần kinh

25

Tôi đặt mọi thứ vào ~/.bashrcvà chỉ source ~/.bashrctrong .profile.

Điều này cho phép các phiên màn hình và xterm (và tôi đoán tmux) kế thừa môi trường của tôi vì các phiên không đăng nhập chỉ chạy .bashrc, trong khi các phiên đăng nhập (ví dụ như terminal hoặc iTerm) chỉ chạy .profile.


1
Đây là cách tiếp cận của tôi. Bằng cách này, tôi có thể duy trì một .bashrc hoạt động trên cả hai hệ thống ... và tôi có thể đặt bất kỳ nội dung cụ thể nào của mac hoặc các công cụ như bí danh chỉ dành cho công việc (nơi tôi sử dụng mac nhiều nhất) trong tệp .bash_profile của mình.
Michael Durrant

2
Lưu ý rằng .profilephổ biến đối với một số shell và chỉ nên chứa mã sh tương thích POSIX. Nếu có nguồn, .bashrcnó có thể chứa mã dành riêng cho Bash (sự tồn tại của .bashrctệp là dành riêng cho Bash). Tôi khuyên bạn nên đổi tên của bạn .profilethành .bash_profilevì bạn đang sử dụng nó theo cách cụ thể của Bash. Hoặc, đặt mã chung vào .profilevà tạo một .bash_profilenguồn đó .profile.bashrc.
Chris Trang

19

Có hai kịch bản:

  1. Bạn đang sử dụng Linux
  2. Bạn đang sử dụng Mac Os X

Đối với cả hai bạn muốn nguồn ~/.bashrctrong hồ sơ của bạn được tải, hoặc có nguồn gốc, khi vỏ của bạn cho thiết bị đầu cuối của bạn bắt đầu.


LINUX

Trong Linux, ~/.profilelà nguồn tự động trong vỏ của bạn khi nó khởi động. Vì vậy, nếu bạn đi đến thiết bị đầu cuối và gõ cd ~; ls -A, bạn sẽ thấy tất cả các tệp và thư mục của bạn trong thư mục chính của bạn ( /home/usrname/). Bạn sẽ thấy một tập tin gọi là .profile. Đây là tập tin tự động "có nguồn gốc" khi bạn khởi động thiết bị đầu cuối.

Nếu bạn muốn thêm bí danh và hàm vào ~/.bashrc(đó là những gì tôi làm), thì bạn nên (bên trong ~/.profilethêm một câu lệnh if kiểm tra nếu ~/.bashrclà một tệp không trống và sau đó lấy nguồn.

Để kiểm tra xem bạn ~/.profileđã làm điều này chưa nano ~/.profile. Điều này sẽ mở nó trong một trình soạn thảo văn bản (bạn có thể sử dụng gedit nếu bạn biết bạn có nó hoặc thậm chí là vim nếu bạn biết cách sử dụng nó). Bạn có thể nhận được một tệp văn bản trống (bạn không nên), nhưng nếu bạn chỉ cần tiến hành. Nếu bạn không thấy một dòng nào ở bất cứ nơi nào nói source ~/.bashrc, thì hãy nhập các dòng sau vào một nơi nào đó (đặt nó ở một nơi hợp lý như ở cuối hoặc đầu và không ở giữa một câu lệnh if):

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

Điều này kiểm tra nếu ~/.bashrclà một tệp không trống (với if [ -s ~/.bashrc ]) và nếu nó là như vậy, nó sẽ nguồn nó. Khá đơn giản. Bây giờ, bạn có thể thêm bất kỳ bí danh hợp lệ, chức năng, biến, vv để ~/.bashrc.


MAC OS X

Theo mặc định, các nguồn Max OS X ~/.bash_profile. Để có thể thêm mọi thứ vào ~/.bashrc(đó là, một lần nữa, những gì tôi làm trong OS X cũng vậy), sau đó bạn làm theo quy trình tương tự như linux. Trong thiết bị đầu cuối nhập cd ~; nano .bash_profile. Kiểm tra một dòng có nội dung source ~/.bashrcvà nếu nó không có, hãy thêm câu lệnh if ở trên ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


GHI CHÚ

Khi viết một câu lệnh if, hãy chắc chắn để lại khoảng trắng giữa mọi thứ về cơ bản (ví dụ: if [ -s ~/.bashrc]; then echo "found"; fikhông hoạt động vì không có khoảng trắng ~/.bashrc]- trình thông dịch sẽ nghĩ đây là một từ).

Nếu bạn muốn tìm ra cách kiểm tra nội dung trong câu lệnh if tốt hơn, hãy đi đến terminal và nhập man \[; điều này về cơ bản mang đến cho bạn sự rút gọn của một câu lệnh if. Ví dụ, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fikiểm tra nếu /path/to/filelà một tệp và nếu nó được in ra thiết bị xuất chuẩn tương ứng. Tôi luôn luôn tham khảo điều này để dễ nhìn hơn và tham khảo nhanh: 7.2. Toán tử kiểm tra tập tin .

Tôi hi vọng cái này giúp được. Tôi nhớ tôi đã bối rối như thế nào khi tôi bắt đầu tất cả những thứ này (mà cách đây không lâu); vì vậy, chúc may mắn với những nỗ lực tương lai UNIX của bạn!


Trên linux, .profilechỉ có nguồn gốc nếu shell của bạn là shell đăng nhập, nếu không .bashrcthì có nguồn gốc
smac89

11

Tìm nguồn .profile trong .bash_profile đã làm điều đó cho tôi

echo 'source ~/.profile' >> ~/.bash_profile

1
Tìm nguồn .profile trong .bash_profile là một việc tuyệt vời để làm, nhưng điều đó một mình sẽ không khiến .bashrc được chạy bởi các shell đăng nhập. .Profile của bạn phải có nguồn gốc .bashrc, điều này có thể gây ra sự cố nếu bạn sử dụng shell không phải là bash. Hầu hết người dùng Mac sẽ không bao giờ, nhưng nếu bạn làm vì một số lý do, hãy nhớ điều này. :)
Terry N

Để mở rộng những gì @TerryN đã nói: hãy chắc chắn lấy nguồn .bashrctừ của bạn .bash_profilechứ không phải từ .profile. .bash_profilelà đặc thù của Bash và nên nguồn hai cái kia.
Chris Trang

6

Tôi thấy rằng sau khi cài đặt rvm (trình cài đặt tự động, không chỉnh sửa thủ công), nó đã tự tạo một ~/.bash_logintệp, nơi mà trước đây tôi chưa từng có.

Tuy nhiên, điều này có nghĩa là ~/.profilecác thiết lập và bí danh của tôi không còn được tải nữa! Rất nhiều phím tắt biến mất. Tôi nghĩ rằng họ chạy tuần tự, không độc quyền: - /

Tôi đã thêm

. ~/.profile 

để ~/.bash_loginxâu chuỗi những thứ như tôi mong đợi.


+1, đây là tình huống tôi đã có. Tôi thấy rằng .bash_login hoặc .bash_profile sẽ ngăn .profile không được thực thi ... Không biết tại sao bash cảm thấy cần phải có quá nhiều tệp khởi động xung đột.
RichVel

.profilelà phổ biến cho một số shell khác nhau và chỉ nên chứa mã sh tương thích POSIX. .bash_profilelà đặc trưng của Bash và có thể chứa mã dành riêng cho Bash. Nói chung, nếu bạn đang sử dụng Bash, bạn nên ưu tiên .bash_profiletrừ khi bạn cẩn thận để đảm bảo rằng mã khởi động của bạn không chứa bất cứ thứ gì phụ thuộc vào Bash. Bất cứ chương trình nào được tạo ra .bash_logincó thể đã làm như vậy bởi vì nó chứa mã dành riêng cho Bash, nhưng nó nên bao gồm mã cho nguồn .profilenếu nó tồn tại.
Chris Trang

3

Đặt...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... Trong ~/.bashrc, và sau đó nguồn ~/.bashrcvào của tôi ~/.bash_profile không hoạt động cho chương trình Terminal được cài đặt.

Nhưng sau đó tôi đã đi đến trình đơn thả xuống Chỉnh sửa> Tùy chọn hồ sơ , tab Tiêu đề và Lệnh và chọn lệnh Run làm vỏ đăng nhập từ phần lệnh của trang đó.

Sau khi làm như vậy, bắt đầu một thiết bị đầu cuối mới hiển thị kết quả mong muốn khi tôi nhập

 type rvm|head -1

tức là "rvm là một hàm". Nó đã không làm điều đó cho đến khi tôi thực hiện thay đổi này, và đó là sự thay đổi duy nhất tôi làm sau .bash_profile.bashrcthay đổi mô tả trong câu trả lời khác ở đây.


2

Trước hết, để tôi nói với bạn rằng đó ~/.bashrclà tệp được thực thi mỗi khi shell thứ hai được gọi lên (ví dụ như khi chạy tập lệnh shell) và ~/.profileđược gọi trong mỗi lần đăng nhập.

Vì vậy, tôi khuyên bạn nên viết . ~/.bashrclệnh trong ~/.profiletệp của mình và lệnh này sẽ thực thi tệp bashrc mỗi khi bạn đăng nhập.


Khi .profile được thực thi khi đăng nhập, nó sẽ tự động thực thi tệp .bashrc.
arun rana

vì vậy .bashrc được thực thi gián tiếp tại mỗi lần đăng nhập
arun rana

1
bashrc là dành cho shell không đăng nhập. bash_profile / bash_login / profile / bất cứ thứ gì khác dành cho shell đăng nhập. Đây là một nguồn gây ra sự tranh chấp rất lớn, liên quan đến cái gì và không phải là vỏ đăng nhập (ví dụ: phiên màn hình / tmux, một thiết bị đầu cuối trong môi trường máy tính để bàn, v.v.). Nó không nhất thiết là "vỏ thứ hai". Đó là một vấn đề của vỏ.
Jason Salaz

3
Nếu bạn từng sử dụng shell không phải Bash, làm những gì bạn mô tả có thể gây ra vấn đề cho bạn. .profile áp dụng cho tất cả các hệ vỏ và .bashrc có thể chứa ngôn ngữ mà một số hệ vỏ khác không hiểu. Thay vì .profile, hãy đặt những gì bạn đã viết vào .bash_profile. (Ngoài ra, hãy tạo điều đầu tiên .bash_profile là "nguồn .profile".)
Terry N

1

Tôi gặp vấn đề tương tự sau khi cài đặt rbenv trên máy chủ từ xa (Digital Ocean) Ubuntu 16.04.

Nó bằng cách nào đó tạo ra ~/.bash_profile. Nó giống nhau ~/.bashrctrên hệ thống OS X.

Và Ubuntu bắt đầu chỉ đọc ~/.bash_profile, nhưng không phải ~/.bashrcnhư vậy.

Vì vậy, tôi chỉ sao lưu dữ liệu của mình ~/.bash_profilevới điều này:

mv ~/.bash_profile ~/.bash_profile.bak

Và đổi tên cũ ~/.bashrcthành~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Nó làm việc cho tôi. Sau khi đăng nhập ssh tôi có mọi thứ được tải vào ~/.bashrc.


0

Trong trường hợp điều này có thể giúp bất cứ ai khác ...

Đảm bảo bạn đang chỉnh sửa đúng .bashrctệp cho đúng người dùng. Tôi đã có một vấn đề tương tự bằng cách sử dụng Vagrant. Sau khi chạy tập tin vagrant sshcủa tôi .bashrcđã không được chạy. Giải pháp rất đơn giản ở chỗ tôi nghĩ vagrant đã đăng nhập với người dùng có tên vagrant và tôi thực sự đang đăng nhập với tư cách là một người dùng khác. Vì vậy, tôi đã chỉnh sửa các .bashrctập tin sai . Sau khi chỉnh sửa .bashrctập tin chính xác, bí danh của tôi đã được công nhận.


-1

Nhân tiện, nếu bạn đã kích hoạt ZSH, nó sẽ thay thế bash!

Vì vậy, tất cả các ~/.bashrctệp không được tải.

Bạn phải đặt bí danh của bạn ~/.zshrcthay vào đó.


-2

Để giữ thông tin đăng nhập kiểu OSX .profilevà hỗ trợ hành vi bash bình thường, .bashrcbạn có thể sử dụng .bashrctệp nếu bạn chuyển đổi giữa nix thông thường và OSX bằng cách cung cấp một liên kết tượng trưng cho .bashrctệp của bạn được gọi .bash_profile. Chỉ cần đảm bảo rằng tệp này không tồn tại trước khi thử nó, nhưng đây là cách tôi làm.

ln -s .bashrc .bash_profile

Bằng cách thực hiện liên kết này giữa 2 tập lệnh khởi tạo shell khác nhau, bạn sẽ mất một chức năng tách biệt cần thiết. Một ngày nào đó, bạn sẽ cần một khởi tạo ở cấp phiên ( .bash_profile) và khởi tạo khác nhau ở mỗi cấp độ vỏ ( .bashrc).
dan

-2

/ etc / bashrc dành cho hồ sơ toàn cầu trên các hệ thống mac. Bạn có thể thêm: alias ls = "ls -G" vào đầu tệp này và tốt, mọi người sẽ có các tệp và thư mục được tô màu trên hệ thống để bạn không phải đặt thêm bất cứ thứ gì cho mỗi người dùng. Bạn cũng sẽ nhận thấy cùng với "sudo su -" để root từ chính bạn, bạn vẫn sẽ có các tệp và thư mục được tô màu mà không phải đau đầu thêm.

Một mẹo thú vị khác: Khi sử dụng Iterm2 của mac, nhập cấu hình màu sẽ hiển thị màu của các tệp và thư mục ngay lập tức theo bảng màu của bạn sau khi cài đặt tùy chọn "/ etc / bashrc" nà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.