ฉันจะโหลด. bashrc ใหม่ได้อย่างไรโดยไม่ต้องออกจากระบบและกลับเข้ามาใหม่


คำตอบ:


2635

คุณเพียงแค่ต้องป้อนคำสั่ง:

source ~/.bashrc

หรือคุณสามารถใช้เวอร์ชันที่สั้นกว่าของคำสั่ง:

. ~/.bashrc

88
สิ่งนี้ไม่เหมือนกับการเข้าสู่ระบบและออกจากระบบ สมมติว่าคุณมีบรรทัดต่อไปนี้ใน .bashrc: แล้วคุณจะเปลี่ยนไปexport PATH=$PATH:foo export PATH=$PATH:barหากคุณเข้าสู่ระบบและออกจากระบบbarจะอยู่ใน PATH แต่ถ้าคุณทำสิ่งที่คุณแนะนำทั้งสองfooและbarจะอยู่ใน PATH คุณรู้วิธีรอบนี้หรือไม่?
HighCommander4

7
@ HighCommander4 - วิธีที่ไม่น่าพึงพอใจมาก ๆ ในการทำสิ่งที่คุณต้องการคือการทำ "bash -l" อย่างไรก็ตามสิ่งนี้จะสร้าง subshell ใหม่จริง ๆ และเมื่อคุณออกจากระบบคุณจะกลับไปที่เชลล์ที่ล้อมรอบซึ่ง "foo" ยังอยู่ใน PATH หากคุณสนใจ PATH คุณสามารถทำ "unset PATH" และสร้างมันใหม่จากศูนย์ แต่อาจจะง่ายกว่า / ปลอดภัยกว่าคือ "PATH = / bin: / usr / bin" ก่อนที่จะทำการจัดหา. bashrc ของคุณ วิธีที่ตัวแปร PATH ถูกสร้างขึ้นบนการเข้าสู่ระบบนั้นซับซ้อนจริง ๆ แล้วเกี่ยวข้องกับอินพุตอย่างน้อยที่สุดจากการเข้าสู่ระบบ (ดู "man login") และ / etc / profile (ดู "man bash")
George Hawkins

2
@Alex คุณสามารถทำให้เป็นอัตโนมัติได้โดยเพิ่มบรรทัด ~ / .bashrc ลงใน ~ / .bash_profile แม้ว่าฉันจะไม่รู้ว่านี่เป็นวิธีปฏิบัติที่ดีหรือไม่
Vivek Gani

4
ฉันขอแนะนำให้สร้างนามแฝง (ซึ่งคุณสามารถเก็บไว้ใน ~ / .bashrc หรือ ~ / .bash_aliases) ที่เปิด. bashrc และโหลดใหม่หลังจากตัวแก้ไขออก คุณสามารถทำมันได้โดยการรวมสองคำสั่งในนามแฝงตัวอย่างเช่นดังนั้น alias editbashrc='vim ~/.bashrc; source ~/.bashrc'(ถ้าเป็นกลุ่มเป็นบรรณาธิการที่ต้องการของคุณมิฉะนั้นสลับออกไปเป็นอย่างอื่น): สิ่งนี้จะทำให้การแก้ไขราบรื่นยิ่งขึ้นเนื่องจากคุณไม่จำเป็นต้องคิดถึงการโหลดซ้ำหลังจากทำการแก้ไขหากใช้นามแฝงที่กำหนดเอง
ซามูเอลแลมปา

6
มันจะส่งผลกระทบเพียงขั้วปัจจุบัน
matepal297

283

หรือคุณสามารถใช้:

exec bash

สิ่งนี้ทำสิ่งเดียวกันและจดจำได้ง่ายกว่า (อย่างน้อยสำหรับฉัน)

execคำสั่งสมบูรณ์แทนที่กระบวนการเปลือกโดยการทำงานที่ระบุบรรทัดคำสั่ง ในตัวอย่างของเรามันจะแทนที่สิ่งที่เชลล์ปัจจุบันอยู่กับอินสแตนซ์ใหม่ของbash(ด้วยไฟล์คอนฟิกูเรชันที่อัพเดต)


13
คุณช่วยอธิบายความแตกต่างของsource .bashrcคำสั่งและexec bash?
muradin

18
@muradin, sourceเป็นในตัวคำสั่งของเชลล์ที่รันเนื้อหาของไฟล์ผ่านเป็นอาร์กิวเมนต์ในเปลือกปัจจุบัน ดังนั้นในตัวอย่างของคุณมันรันไฟล์. bashrc ในเชลล์ปัจจุบัน และexecคำสั่งแทนที่เชลล์ด้วยโปรแกรมที่กำหนดในตัวอย่างของคุณมันจะแทนที่เชลล์ด้วย bash (พร้อมไฟล์การกำหนดค่าที่อัปเดต)
WhoSayIn

3
ในกรณีที่เฉพาะเจาะจงมากเกินไปสิ่งนี้สั่นสะเทือนไปหมด My Dockerfile เรียกใช้งานสคริปต์การติดตั้งที่แก้ไข. bashrc ฉันจำเป็นต้องโหลดซ้ำ แต่. ~/.bashrcจะดำเนินการdashแทนbashดังนั้นจึงมีข้อผิดพลาดเนื่องจากshoptขาดหายไป sourceไม่พบจากเชลล์ดังนั้นโซลูชันจึงออกมาเช่นกัน ฉันลองสิ่งนี้และภาพนักเทียบท่าสร้างขึ้นอย่างราบรื่น!
m59

9
สง่างาม แต่ "ทำสิ่งเดียวกัน" ไม่ถูกต้องทั้งหมด source ~/.bashrcจะรักษาสภาพแวดล้อมเชลล์ทั้งหมดของคุณ(แม้ว่าอาจมีการแก้ไขโดยการจัดหา~/.bashrc) ในขณะที่exec bashจะรักษาตัวแปรสภาพแวดล้อมของเชลล์ปัจจุบันเท่านั้น(การเปลี่ยนแปลงแบบ ad-hoc ใด ๆ กับเชลล์ปัจจุบันในแง่ของตัวแปรเชลล์ฟังก์ชันและตัวเลือกจะหายไป) ขึ้นอยู่กับความต้องการของคุณวิธีการหนึ่งหรือวิธีอื่นอาจเป็นที่ต้องการ
mklement0

12
@SEOF เมื่อคุณพูดว่า "bash inception" และหากคุณกำลังคิดในสิ่งที่ฉันคิดว่าคุณกำลังคิดอยู่ฉันต้องบอกว่าคุณผิด exec bashซึ่งแตกต่างจากหนังที่คุณไม่ได้เก็บไว้ในการที่จะเข้าสู่การทุบตีจากทุบตีเมื่อคุณทำซ้ำ ๆ execคำสั่งแทนที่เปลือกกับโปรแกรมในกรณีของเราทุบตี ดังนั้นจึงมีอินสแตนซ์หนึ่งของการทุบตีอยู่ในเทอร์มินัล
John Red

121

เพื่อเสริมและเปรียบต่างคำตอบที่ได้รับความนิยมมากที่สุดสองรายการ. ~/.bashrcและexec bash:

โซลูชันทั้งสองโหลดใหม่ได้อย่างมีประสิทธิภาพ~/.bashrcแต่มีความแตกต่าง:

  • . ~/.bashrcหรือsource ~/.bashrcจะเก็บเปลือกปัจจุบันของคุณ :

    • ยกเว้นสำหรับการปรับเปลี่ยนที่โหลด~/.bashrcเข้าไปในเปลือกปัจจุบัน ( sourcing ) ทำให้เปลือกปัจจุบันและสถานะของมันจะถูกเก็บรักษาไว้ซึ่งรวมถึงตัวแปรสภาพแวดล้อมตัวแปรเปลือกตัวเลือกเปลือกหอยเปลือกฟังก์ชั่นและประวัติคำสั่ง
  • exec bashหรือexec "$BASH"[1]แข็งแกร่งขึ้นจะแทนที่เชลล์ปัจจุบันของคุณด้วยอินสแตนซ์ใหม่และดังนั้นจะรักษาตัวแปรสภาพแวดล้อมของเชลล์ปัจจุบันของคุณเท่านั้น (รวมถึงเชลล์ที่คุณกำหนดไว้ในโฆษณา)

    • กล่าวอีกนัยหนึ่ง: ad-hoc ใด ๆ เปลี่ยนเป็นเชลล์ปัจจุบันในแง่ของตัวแปรเชลล์, ฟังก์ชั่นเชลล์, ตัวเลือกเชลล์, ประวัติคำสั่งจะหายไป

ขึ้นอยู่กับความต้องการของคุณอาจเลือกวิธีใดวิธีหนึ่ง


[1] exec bashสามารถในทฤษฎีดำเนินการที่แตกต่างกัน ปฏิบัติการมากกว่าหนึ่งที่เริ่มต้นเปลือกปัจจุบันถ้ามันเกิดขึ้นอยู่ในไดเรกทอรีที่ระบุไว้ก่อนหน้านี้ในbash $PATHเนื่องจากตัวแปรพิเศษ$BASHจะมีพา ธ เต็มของไฟล์สั่งการที่เริ่มต้นเชลล์ปัจจุบันexec "$BASH"อยู่เสมอดังนั้นจึงรับประกันได้ว่าจะใช้ไฟล์ปฏิบัติการเดียวกันได้
หมายเหตุ"..."เกี่ยว$BASHกับการอ้างอิงสองครั้งทำให้มั่นใจว่าค่าตัวแปรถูกใช้ตามสภาพโดยไม่ต้องตีความโดย Bash; หากค่าไม่มีช่องว่างที่ฝังตัวหรือตัวบ่งชี้เชลล์อื่น ๆ (ซึ่งไม่น่าจะเกิดในกรณีนี้) คุณไม่จำเป็นต้องใช้เครื่องหมายคำพูดคู่ แต่การใช้มันเป็นนิสัยที่ดี


คุณตอบคำถามของฉันก่อนที่ฉันจะถามมัน เป็นการดีที่จะรู้ ฉันมักจะกำหนด CLASSPATH ของฉันสำหรับเซสชั่นเดียว
swinefish

ดังนั้นแม้ว่าฉันจะเรียก exec "$ BASH" ตัวแปรที่จะพบชุด. bashrc ในเชลล์ที่ฉันเปิดถัดไป (ใช้ไฟล์ปฏิบัติการเดียวกับเซสชันปัจจุบันของฉัน) หรือไม่
nitinr708

3
@ nitinr708: ใช่exec $BASHจะเป็นแหล่งที่มา~/.bashrcดังนั้นคุณจะเห็นการเปลี่ยนแปลงสภาพแวดล้อมของเชลล์ในเซสชันใหม่
mklement0

@ Gaming32 ฉันขอขอบคุณความคิดของเชิงอรรถที่เชื่อมโยงหลายมิติ แต่มันใช้งานไม่ได้จริง ๆ (และในคำตอบสั้น ๆ ว่าอันนี้มันไม่สำคัญเลย)
mklement0

44

มีคนแก้ไขคำตอบของฉันเพื่อเพิ่มภาษาอังกฤษที่ไม่ถูกต้อง แต่ที่นี่เป็นของจริง

. .bashrc

25
วิธีนี้จะใช้งานได้หากไดเรกทอรีปัจจุบันของคุณคือไดเรกทอรีบ้านของคุณ สิ่งต่อไปนี้จะได้ผล:. ~ / .bashrc
Brian Showalter

6
อะไรทำให้งานนี้ จะเกิดอะไรขึ้นเมื่อฉัน ".bashrc" ขอบคุณ!
Jed Daniels

54
. เป็นทางลัด BASH สำหรับคำสั่ง builtin "source" ดังนั้น ".bashrc" จึงเหมือนกับ "source .bashrc" กับตัวแปล BASH
Brian Showalter

7
เย็น. ขอบคุณ ตอนนี้ฉันไม่รู้
Jed Daniels

2
ฉันเพิ่งส่งคำขอแก้ไขเพื่อเพิ่ม~/แต่เนื่องจากคำตอบยอดนิยมแสดงทั้งคู่source ~/.bashrcและ. ~/.bashrcฉันสงสัยว่าคำตอบนี้ควรถูกลบซ้ำซ้อน
Max Ghenis

18

ขึ้นอยู่กับสภาพแวดล้อมของคุณเพียงพิมพ์

bash

อาจใช้งานได้


15
อย่างไรก็ตามสิ่งนี้จะเรียกใช้เชลล์ใหม่ภายในเชลล์ปัจจุบันซึ่งเป็นการสิ้นเปลืองทรัพยากร ควรใช้โซลูชันexecของ @ WhoSayln ที่ดีกว่าซึ่งจะแทนที่เชลล์ปัจจุบันด้วยเชลล์ที่ถูกเรียกใหม่
แบร์นฮาร์ดแว็กเนอร์

ใช่เพียงแค่ใช้แหล่งที่มา สิ่งนี้ไม่จำเป็นและน่ารำคาญอย่างสิ้นเชิง
dylnmc

นอกจากนี้ในการแสดงความคิดเห็น @ BernhardWagner ของคุณยังหลวมประวัติทุบตีปัจจุบันของคุณหากคุณวางไข่เปลือกใหม่
peterchaula

นี่เป็นทางออกที่ดีโดยการ จำกัด สิทธิ์ของผู้ใช้
Tunde Pizzle

การเรียกใช้กระบวนการย่อยเพิ่มเลเยอร์ของความซับซ้อนที่ไม่มีค่าเพิ่มเติม
Alan Berezin

18

ด้วยสิ่งนี้คุณจะไม่ต้องพิมพ์ "source ~ / .bashrc":

รวมไฟล์ bashrc ของคุณ:

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

ทุกครั้งที่คุณต้องการแก้ไข bashrc ของคุณเพียงแค่เรียกใช้นามแฝง " rc "


15

2
exec bashยังคงสืบทอดสภาพแวดล้อมของเชลล์ปัจจุบัน exec env -i bashจะใกล้ชิดขึ้น (หรือexec env -i bash -lถ้าคุณอยู่ในเปลือกเข้าสู่ระบบในปัจจุบัน)
chepner

5

คุณอาจต้องการเพิ่มสคริปต์เพื่อให้โหลด. bashrc โดยอัตโนมัติเมื่อคุณเปิดเซสชัน SSH ทั้งนี้ขึ้นอยู่กับสภาพแวดล้อมของคุณ ฉันเพิ่งย้ายข้อมูลไปยังเซิร์ฟเวอร์ที่ใช้ Ubuntu และที่นั่นไฟล์. profile ไม่ใช่. bashrc หรือ. bash_profile ถูกโหลดโดยค่าเริ่มต้น ในการรันสคริปต์ใด ๆ ใน. bashrc ฉันต้องเรียกใช้source ~/.bashrcทุกครั้งที่มีการเปิดเซสชันซึ่งไม่ได้ช่วยเมื่อเรียกใช้ deploys ระยะไกล

หากต้องการให้. bashrc ของคุณโหลดโดยอัตโนมัติเมื่อเปิดเซสชันให้ลองเพิ่มลงใน. profile:

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

เปิดเซสชันของคุณอีกครั้งและควรโหลดพา ธ / สคริปต์ที่คุณมีใน. bashrc


ฉันมีสิ่งนี้ใน ".profile" แต่มันไม่ทำงาน - ทุกครั้งที่ฉันออกไปฉันต้องทำด้วยมือ ข้อเสนอแนะใด ๆ
Wayne Smallman

4

ฉันใช้ easyengine เพื่อตั้งค่าเซิร์ฟเวอร์ vultr บนคลาวด์ของฉัน ผมพบว่าไฟล์ทุบตีฉันที่
/etc/bash.bashrc

ดังนั้นsource /etc/bash.bashrcเคล็ดลับสำหรับฉัน!

ปรับปรุง

เมื่อตั้งค่าเซิร์ฟเวอร์เปล่า (Ubuntu 16.04) คุณสามารถใช้ข้อมูลข้างต้นเมื่อคุณยังไม่ได้ตั้งชื่อผู้ใช้และเข้าสู่ระบบผ่านทางรูท

เป็นการดีที่สุดที่จะสร้างผู้ใช้ (ที่มีสิทธิ์ sudo) และลงชื่อเข้าใช้ด้วยชื่อผู้ใช้นี้แทน
สิ่งนี้จะสร้างไดเรกทอรีสำหรับการตั้งค่าของคุณรวมถึงไฟล์. profile และ. bashrc
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

ตอนนี้คุณจะแก้ไขและ (และ "แหล่งที่มา") ~/.bashrcไฟล์

บนเซิร์ฟเวอร์ของฉันนี้ตั้งอยู่ที่/home/your_username/.bashrc
(ที่your_usernameจริงแล้วเป็นชื่อผู้ใช้ใหม่ที่คุณสร้างไว้ด้านบนและตอนนี้เข้าสู่ระบบด้วย)


4

exec bash เป็นวิธีที่ยอดเยี่ยมในการเรียกใช้งานใหม่และเปิดตัวเชลล์ใหม่เพื่อแทนที่ปัจจุบัน เพียงเพิ่มคำตอบ $ SHELL จะส่งคืนเชลล์ปัจจุบันซึ่งเป็น bash โดยใช้สิ่งต่อไปนี้มันจะทำการรีโหลดเชลล์ปัจจุบันและไม่เพียง แต่จะ bash

exec $SHELL -l;


3

สำหรับฉันจะทำงานเมื่อฉันเปลี่ยนเส้นทางคือ: exec "$BASH" --login


คำถามเกี่ยวกับการโหลดซ้ำ~/.bashrcซึ่ง--loginจะไม่โหลดโดยตรง (โดยตรง) ที่ระดับผู้ใช้จะเป็นการโหลด~/.bash_profile(หรือ~/.bash_loginหรือ~/.profile) แทน
mklement0

3

พิมพ์:

source ~/.bashrc

หรือในรูปแบบที่สั้นกว่า:

. ~/.bashrc


1
อีกครั้งใช้งานได้เฉพาะในกรณีที่คุณอยู่ในโฮมไดเร็กตอรี่หรือมากกว่านั้นในไดเรกทอรีที่.bashrcตั้งอยู่ source ~/.bashrcวิธีที่ถูกต้องมากขึ้นในการทำเช่นนี้เป็นบอกในคำตอบที่ได้รับการยอมรับเป็น
John Red

2

ฉันใช้คำสั่งต่อไปนี้ใน msysgit

. ~/.bashrc

รุ่นที่สั้นกว่าของ

source ~/.bashrc

@jwg คำตอบที่ยอมรับคือ .bashrc จะทำงานเฉพาะในกรณีที่คุณอยู่ในโฮมไดเรกทอรีบน msysgit
Sojan V Jose

@ jwg ok ฉันผอมฉันพูดถึงว่าคุณไม่ต้องพิมพ์ 'source ~ / .bashrc' แทนที่จะใช้เวอร์ชันที่สั้นกว่า
Sojan V Jose

@jwg โอเคฉันเพิ่มเป็นแก้ไขคำตอบเดิม :)
Sojan V Jose

ทำไมคำตอบที่ซ้ำซ้อน @Sojan
nitinr708

@ nitinr708 2014 ฉันเพิ่งจะจำได้: หน้า คำตอบเดิมถูกแก้ไขในภายหลังสิ่งที่ฉันเดา
Sojan V Jose

2

สมมติว่าเชลล์เชิงโต้ตอบและคุณต้องการเก็บประวัติคำสั่งปัจจุบันของคุณและยังโหลด / etc / โปรไฟล์ (ซึ่งโหลดข้อมูลสภาพแวดล้อมรวมถึง / etc / bashrc และบน Mac OS X โหลดพา ธ ที่กำหนดไว้ใน /etc/paths.d/ ผ่าน path_helper) ผนวกประวัติคำสั่งของคุณและทำ bash ด้วยตัวเลือกเข้าสู่ระบบ ('-l'):

history -a && exec bash -l

1

สิ่งนี้จะได้ผล ..

cd ~
source .bashrc

7
มันทำ แต่มันเปลี่ยนไดเร็คทอรี่สำหรับใช้งานเป็น ~ ซึ่งไม่ต้องการ
Albin

1
ขอบคุณที่รักษาบริบทให้มีชีวิตอยู่ @Krinkle
nitinr708

จำเป็นต้องระบุ~เพื่อเปลี่ยนไดเรกทอรีทำงานเป็นโฮมไดเร็กทอรีของผู้ใช้หรือไม่
Kenly

1

ฉันสังเกตเห็นว่าexec bashคำสั่งบริสุทธิ์จะรักษาตัวแปรสภาพแวดล้อมดังนั้นคุณต้องใช้exec -c bashเพื่อรัน bash ในสภาพแวดล้อมที่ว่างเปล่า

ตัวอย่างเช่นคุณเข้าสู่ระบบทุบตีและexport A=1ถ้าคุณที่exec bashA == 1

หากคุณexec -cl bash, Aเป็นที่ว่างเปล่า

ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการทำงานของคุณ


-2

ฉันมี

alias ..='source ~/.bashrc'

ใน bashrc ของฉันเพื่อที่ฉันจะสามารถใช้ ".. " เพื่อโหลดซ้ำได้


4
หลายคนใช้..เป็นนามแฝงcd ..ดังนั้นมันจะสับสนมาก
เจ้าพ่อ

ความคิดที่ดียกเว้นชื่อนามแฝง alias rehash='source ~/.bashrc'เป็นทางเลือกของฉัน
Frank Nocke

ใช้บางอย่างเช่น "_rs" ซึ่งฉันใช้เป็นรีโหลดเชลล์ ฉันค่อนข้างใช้ _ สำหรับการเริ่มต้นนามแฝงของฉัน; ซึ่งคล้ายกับ js libs underscorejs หรือ lodash
จิมมี่ MG Lim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.