Làm cách nào để tải lại .bashrc mà không cần đăng xuất và đăng nhập lại?


1644

Nếu tôi thay đổi .bashrc, làm cách nào để tải lại mà không cần đăng xuất và đăng nhập lại?

Câu trả lời:


2638

Bạn chỉ cần nhập lệnh:

source ~/.bashrc

hoặc bạn có thể sử dụng phiên bản ngắn hơn của lệnh:

. ~/.bashrc

88
Điều này không hoàn toàn giống như đăng nhập và đăng xuất. Giả sử bạn có dòng sau trong .bashrc : export PATH=$PATH:foo, và sau đó bạn đổi nó thành export PATH=$PATH:bar. Nếu bạn đăng nhập và thoát ra, barsẽ chỉ có trong PATH, nhưng nếu bạn làm theo những gì bạn đề xuất, cả hai foobarsẽ ở trong PATH. Bạn có biết một cách xung quanh này?
HighCommander4

7
@ HighCommander4 - một cách rất không thỏa đáng để thực hiện những gì bạn muốn là làm "bash -l" tuy nhiên điều này thực sự tạo ra một lớp con mới và khi bạn đăng xuất, bạn sẽ quay lại vỏ bọc trong đó "foo" vẫn còn trong PATH. Nếu bạn chỉ quan tâm đến PATH, bạn có thể thực hiện "hủy đặt PATH" và xây dựng lại từ đầu, nhưng có lẽ dễ dàng / an toàn hơn là thực hiện "PATH = / bin: / usr / bin" trước khi tìm nguồn cung cấp .bashrc của bạn. Làm thế nào biến PATH được xây dựng khi đăng nhập thực sự phức tạp một cách hợp lý, liên quan đến đầu vào ít nhất là từ đăng nhập (xem "đăng nhập man") và / etc / profile (xem "man bash").
George Hawkins

2
@Alex bạn có thể tự động hóa nó bằng cách thêm dòng ~ / .bashrc vào ~ / .bash_profile, mặc dù tôi không biết liệu đây có phải là một cách thực hành tốt hay không.
Vivek Gani

4
Tôi cũng khuyên bạn nên tạo một bí danh (mà bạn có thể lưu trữ trong ~ / .bashrc hoặc ~ / .bash_aliases) để mở .bashrc và tải lại sau khi trình soạn thảo thoát. Bạn có thể làm điều đó bằng cách kết hợp hai lệnh trong một bí danh, ví dụ như vậy (nếu vim là trình soạn thảo ưa thích của bạn, nếu không thì đổi nó sang một thứ khác) : alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Điều này sẽ giúp việc chỉnh sửa mượt mà hơn rất nhiều, vì bạn không cần phải suy nghĩ về việc tải lại, sau khi thực hiện chỉnh sửa, nếu sử dụng bí danh tùy chỉnh.
Samuel Lampa

6
Nó sẽ chỉ ảnh hưởng đến thiết bị đầu cuối hiện tại.
matepal297

284

Hoặc bạn có thể sử dụng:

exec bash

Điều này cũng làm điều tương tự, và dễ nhớ hơn (ít nhất là đối với tôi).

Các execlệnh thay thế hoàn toàn quá trình shell bằng cách chạy dòng lệnh chỉ định. Trong ví dụ của chúng tôi, nó thay thế bất cứ thứ gì hiện tại là với một thể hiện mới bash(với các tệp cấu hình được cập nhật).


13
Bạn có thể vui lòng giải thích sự khác biệt của source .bashrclệnh và exec bash?
muradin

18
@muradin, sourcelà một lệnh shell tích hợp thực thi nội dung của tệp được truyền dưới dạng đối số, trong shell hiện tại . Vì vậy, trong ví dụ của bạn, nó thực thi tệp .bashrc trong trình bao hiện tại. Và execlệnh thay thế shell bằng một chương trình nhất định, trong ví dụ của bạn, nó thay thế shell của bạn bằng bash (với các tệp cấu hình được cập nhật)
WhoSayIn 24/11/14

3
Trong hoàn cảnh đặc biệt của tôi, điều này hoàn toàn rung chuyển. Dockerfile của tôi thực thi một tập lệnh cài đặt sửa đổi .bashrc. Sau đó tôi cần tải lại, nhưng . ~/.bashrcsẽ thực thi dashthay bashvì vậy, có lỗi vì shoptbị thiếu. sourcekhông tìm thấy từ vỏ, vì vậy giải pháp cũng được đưa ra. Tôi đã thử điều này và hình ảnh docker được xây dựng trơn tru!
m59

9
Thanh lịch, nhưng "làm điều tương tự" không hoàn toàn chính xác. source ~/.bashrcsẽ bảo toàn toàn bộ môi trường shell của bạn (mặc dù có thể được sửa đổi bởi nguồn của ~/.bashrc), trong khi đó exec bashsẽ chỉ bảo toàn các biến môi trường của shell hiện tại của bạn (mọi thay đổi đặc biệt đối với shell hiện tại về các biến shell, hàm, tùy chọn đều bị mất). Tùy thuộc vào nhu cầu của bạn, một hoặc cách tiếp cận khác có thể được ưa thích.
mkuity0

12
@SEoF, khi bạn nói "bash inception" và nếu bạn đang nghĩ những gì tôi nghĩ bạn đang nghĩ, tôi phải nói rằng bạn đã sai. Không giống như bộ phim, bạn không tiếp tục bị bash từ bash khi bạn liên tục làm exec bash. Các execlệnh thay thế vỏ với các chương trình, trong trường hợp, bash của chúng tôi. Vì vậy, luôn có một ví dụ về bash tồn tại trong thiết bị đầu cuối.
John Red

121

Để bổ sung và đối chiếu hai câu trả lời phổ biến nhất . ~/.bashrcexec bash:

Cả hai giải pháp tải lại hiệu quả~/.bashrc , nhưng có sự khác biệt:

  • . ~/.bashrchoặc source ~/.bashrcsẽ bảo vệ vỏ hiện tại của bạn :

    • Ngoại trừ những sửa đổi mà tải lại ~/.bashrcvào vỏ hiện tại ( nguồn ) làm cho, các vỏ hiện tại và trạng thái của nó được bảo tồn , trong đó bao gồm các biến môi trường, biến vỏ, tùy chọn vỏ, chức năng vỏ, và lịch sử lệnh.
  • exec bashhoặc, mạnh mẽ hơn, exec "$BASH"[1] , sẽ thay thế trình bao hiện tại của bạn bằng một thể hiện mới và do đó chỉ bảo toàn các biến môi trường của trình bao hiện tại của bạn (bao gồm cả các biến bạn đã xác định đặc biệt).

    • Nói cách khác: Bất kỳ thay đổi đặc biệt nào đối với shell hiện tại về các biến shell, hàm shell, tùy chọn shell, lịch sử lệnh đều bị mất.

Tùy thuộc vào nhu cầu của bạn, một hoặc cách tiếp cận khác có thể được ưa thích.


Về exec bashmặt lý thuyết, [1] có thể thực thi một tệp thực thi khác bash với lớp khởi động shell hiện tại, nếu nó xảy ra trong một thư mục được liệt kê trước đó trong $PATH. Do biến đặc biệt $BASHluôn chứa đường dẫn đầy đủ của tệp thực thi đã khởi động shell hiện tại, nên exec "$BASH"được đảm bảo sử dụng cùng một tệp thực thi.
Một ghi chú lại "..."xung quanh $BASH: trích dẫn kép đảm bảo rằng giá trị biến được sử dụng nguyên trạng, mà không cần giải thích bởi Bash; nếu giá trị không có không gian nhúng hoặc siêu ký tự shell khác (không có khả năng trong trường hợp này), bạn không thực sự cần dấu ngoặc kép, nhưng sử dụng chúng là một thói quen tốt để hình thành.


Bạn đã trả lời câu hỏi của tôi trước khi tôi có thể hỏi nó. Điều này là tốt để biết; Tôi thường đặt CLASSPATH cho một phiên duy nhất.
cá heo

Vì vậy, ngay cả khi tôi gọi exec "$ BASH", các biến mà bộ .bashrc sẽ được tìm thấy trong shell tôi mở tiếp theo (sử dụng cùng một tệp thực thi như phiên hiện tại của tôi)?
nitinr708

3
@ nitinr708: Có, exec $BASHsẽ có nguồn ~/.bashrc, vì vậy bạn sẽ thấy những thay đổi của nó đối với môi trường shell trong phiên mới.
mkuity0

@ Gaming32, tôi đánh giá cao ý tưởng về một chú thích siêu liên kết, nhưng nó không thực sự hoạt động (và trong một câu trả lời ngắn như bài này, nó không quan trọng lắm).
mkuity0

44

Ai đó đã chỉnh sửa câu trả lời của tôi để thêm tiếng Anh không chính xác, nhưng đây là bản gốc, kém hơn câu trả lời được chấp nhận.

. .bashrc

25
Điều này sẽ chỉ hoạt động nếu thư mục hiện tại của bạn thực sự là thư mục nhà của bạn. Sau đây sẽ làm việc :. ~ / .bashrc
Brian Showalter

6
Điều gì làm cho công việc này? Điều gì thực sự xảy ra khi tôi làm ". .Bashrc"? Cảm ơn!
Jed Daniels

54
. là một phím tắt BASH cho lệnh dựng sẵn "nguồn". Vì vậy, ".bashrc" giống như "nguồn .bashrc" đối với trình thông dịch BASH.
Brian Showalter

7
Mát mẻ. Cảm ơn. Bây giờ tôi không biết.
Jed Daniels

2
Tôi vừa gửi một yêu cầu chỉnh sửa để thêm ~/, nhưng vì câu trả lời hàng đầu hiển thị cả hai source ~/.bashrc. ~/.bashrctôi tự hỏi liệu câu trả lời này có nên bị xóa là dư thừa không.
Max Ghenis

18

Tùy thuộc vào môi trường của bạn, chỉ cần gõ

bash

cũng có thể làm việc


15
Tuy nhiên, điều này sẽ gọi một lớp vỏ mới trong lớp vỏ hiện tại, do đó gây lãng phí tài nguyên. Sử dụng tốt hơn giải pháp exec của @ WhoSayln thay thế shell hiện tại bằng shell mới được gọi.
Bernhard Wagner

vâng chỉ cần sử dụng nguồn. Điều này là hoàn toàn không cần thiết và gây phiền nhiễu.
dylnmc

Ngoài nhận xét của @ BernhardWagner, bạn cũng mất lịch sử bash hiện tại nếu bạn sinh ra một vỏ mới
peterchaula

Đây là giải pháp tốt theo đó quyền truy cập đặc quyền của người dùng bị hạn chế.
Tunde Pizzle

gọi một quy trình con thêm một lớp phức tạp không có giá trị bổ sung.
Alan Berezin

18

Với điều này, bạn thậm chí sẽ không phải gõ "nguồn ~ / .bashrc":

Bao gồm tệp bashrc của bạn:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Mỗi khi bạn muốn chỉnh sửa bashrc của mình, chỉ cần chạy bí danh " rc "


15

2
exec bashvẫn kế thừa môi trường của shell hiện tại. exec env -i bashsẽ gần hơn (hoặc exec env -i bash -lnếu bạn hiện đang ở trong vỏ đăng nhập).
chepner

5

Tùy thuộc vào môi trường của bạn, bạn có thể muốn thêm tập lệnh để tải .bashrc tự động khi bạn mở phiên SSH. Gần đây tôi đã thực hiện di chuyển đến một máy chủ chạy Ubuntu và ở đó, .profile, không phải .bashrc hoặc .bash_profile được tải theo mặc định. Để chạy bất kỳ tập lệnh nào trong .bashrc, tôi phải chạy source ~/.bashrcmỗi khi một phiên được mở, điều này không giúp ích gì khi chạy các triển khai từ xa.

Để tải .bashrc của bạn tự động khi mở phiên, hãy thử thêm phần này vào .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Mở lại phiên của bạn và nó sẽ tải bất kỳ đường dẫn / tập lệnh nào bạn có trong .bashrc.


Tôi có cái này trong ".profile" nhưng nó không hoạt động - mỗi lần tôi thoát, tôi phải làm bằng tay. Bất kỳ đề xuất?
Wayne Smallman

4

Tôi đã sử dụng easyengine để thiết lập máy chủ dựa trên đám mây vultr của mình.
Tôi tìm thấy tập tin bash của tôi tại /etc/bash.bashrc.

Vì vậy, source /etc/bash.bashrcđã lừa cho tôi!

cập nhật

Khi thiết lập một máy chủ trống (ubfox 16.04), bạn có thể sử dụng thông tin trên, khi bạn chưa thiết lập tên người dùng và đang đăng nhập qua root.

Tốt nhất là tạo một người dùng (với sudo privateledges) và đăng nhập làm tên người dùng này.
Điều này sẽ tạo một thư mục cho các cài đặt của bạn, bao gồm các tệp .profile và .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ub Ubuntu /

Bây giờ, bạn sẽ chỉnh sửa và (và "nguồn") ~/.bashrctệp.

Trên máy chủ của tôi, địa chỉ này được đặt tại /home/your_username/.bashrc
(nơi your_usernamethực sự là tên người dùng mới mà bạn đã tạo ở trên và hiện đang đăng nhập)


4

exec bash là một cách tuyệt vời để thực hiện lại và khởi chạy một shell mới để thay thế hiện tại. chỉ để thêm vào câu trả lời, $ SHELL trả về shell hiện tại là bash. Bằng cách sử dụng như sau, nó sẽ tải lại shell hiện tại, và không chỉ để bash.

exec $SHELL -l;


3

Đối với tôi những gì hoạt động khi tôi thay đổi PATH là: exec "$BASH" --login


Câu hỏi là về tải lại ~/.bashrc, --loginsẽ không (trực tiếp) tải lại; ở cấp độ người dùng, nó sẽ tải lại ~/.bash_profile(hoặc ~/.bash_loginhoặc ~/.profile) thay vào đó.
mkuity0

3

kiểu:

source ~/.bashrc

hoặc, ở dạng ngắn hơn:

. ~/.bashrc


1
Một lần nữa, chỉ hoạt động nếu bạn đang ở trong thư mục chính, hoặc chính xác hơn, trong thư mục .bashrcđược đặt. Một cách chính xác hơn để làm điều này, như đã nói trong câu trả lời được chấp nhận, là source ~/.bashrc.
John Red

2

tôi sử dụng lệnh sau trên msysgit

. ~/.bashrc

phiên bản ngắn hơn của

source ~/.bashrc

@jwg câu trả lời được chấp nhận là. .bashrc. sẽ chỉ hoạt động nếu bạn đang ở trong thư mục chính trên msysgit.
Sojan V Jose

@jwg ok tôi mỏng tôi đã đề cập rằng bạn không phải nhập 'nguồn ~ / .bashrc' thay vì sử dụng phiên bản ngắn hơn.
Sojan V Jose

@jwg okay tôi đã thêm nó dưới dạng chỉnh sửa vào câu trả lời ban đầu :)
Sojan V Jose

Tại sao câu trả lời dư thừa @Sojan?
nitinr708

@ nitinr708 2014. tôi hầu như không nhớ: P. câu trả lời ban đầu đã được chỉnh sửa sau đó một cái gì đó tôi đoán.
Sojan V Jose

2

Giả sử trình bao tương tác và bạn muốn giữ lịch sử lệnh hiện tại của mình và cũng tải / etc / profile (tải dữ liệu môi trường bao gồm / etc / bashrc và trên Mac OS X tải các đường dẫn được xác định trong /etc/paths.d/ thông qua path_helper), nối thêm lịch sử lệnh của bạn và thực hiện bash với tùy chọn đăng nhập ('-l'):

history -a && exec bash -l

1

Điều này cũng sẽ làm việc ..

cd ~
source .bashrc

7
Nó có, nhưng nó cũng thay đổi thư mục làm việc thành ~, điều không mong muốn.
Albin

1
Cảm ơn bạn đã giữ cho bối cảnh sống động @Krinkle
nitinr708

Có cần thiết phải chỉ định ~để thay đổi thư mục làm việc sang thư mục nhà người dùng?
Kenly

1

Tôi nhận thấy rằng exec bashlệnh thuần sẽ bảo toàn các biến môi trường, vì vậy bạn cần sử dụng exec -c bashđể chạy bash trong môi trường trống.

Ví dụ, bạn đăng nhập một bash, và export A=1, nếu bạn exec bash, các A == 1.

Nếu bạn exec -cl bash, Atrống rỗng.

Tôi nghĩ rằng đây là cách tốt nhất để làm công việc của bạn.


-2

cá nhân tôi có

alias ..='source ~/.bashrc'

trong bashrc của tôi, để tôi có thể chỉ cần sử dụng ".." để tải lại nó.


4
Nhiều người sử dụng ..như một bí danh cho cd .., vì vậy nó sẽ rất khó hiểu.
Bố già

ngoại trừ tên bí danh là một ý tưởng tốt. alias rehash='source ~/.bashrc'là lựa chọn của tôi
Frank Nocke

sử dụng cái gì đó như "_rs" mà tôi sử dụng để tải lại shell. tôi sử dụng khá nhiều _ để bắt đầu các bí danh của mình; tương tự như js libs underscorejs hoặc lodash.
Jimmy MG Lim
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.