การอัปเกรด Bash ผ่าน Homebrew ปลอดภัยหรือไม่


81

ฉันใหม่สำหรับ OS X ฉันใช้ OS X Lion บน MacBook Pro การอัพเกรด bash shell นั้นปลอดภัยหรือไม่โดยใช้ Homebrew

$ brew install bash

ถ้าปลอดภัยฉันจะทำให้เป็นอินสแตนซ์เริ่มต้นของเชลล์ที่ฉันรันผ่าน Terminal ได้อย่างไร

ขอบคุณ!


2
ทันใดนั้นคำถามนี้มีความเกี่ยวข้องอย่างยิ่งดู Shellshock
ecnepsnai

ใช่. 10 ตัวอักษร
ยั้ง

คำตอบ:


105

/{,usr/}{,s}bin/โดยปกติไบนารีในไม่ควรถูกแทนที่ด้วยไฟล์อื่น โปรแกรมอื่น ๆ คาดว่าพวกเขาจะเป็นรุ่นที่มาพร้อมกับ OS X และพวกเขาจะถูกแทนที่ด้วยการอัพเกรดระบบปฏิบัติการ

หลังจากทำงานbrew install bashคุณสามารถเปลี่ยนเชลล์เริ่มต้นได้อย่างปลอดภัยโดย:

  • กำลังเพิ่ม/usr/local/bin/bashไปยัง/etc/shells
  • chsh -s /usr/local/bin/bashเล่น

การตั้งค่าใน Terminal หรือ iTerm 2 ไม่จำเป็นต้องเปลี่ยน ทั้งคู่เป็นค่าเริ่มต้นในการเปิดหน้าต่างใหม่ด้วยล็อกอินเชลล์ของเชลล์เริ่มต้น

เปลือกเริ่มต้นยังสามารถเปลี่ยนจากการตั้งค่าระบบหรือ dscl /var/db/dslocal/nodes/Default/users/$USER.plistแต่ทั้งหมดสามตัวเลือกเพียงแค่ปรับเปลี่ยน


ดูเหมือนว่าจะทำงานได้และถ้าฉันพบปัญหาใด ๆ มันควรจะย้อนกลับได้ง่าย! ขอบคุณ!
รูดี้

ไม่ทราบว่าหน้าตัวเลือกขั้นสูงอยู่ที่นั่น หวาน!
lemonginger

2
/etc/shellsจำเป็นต้องมีบิตเกี่ยวกับการแก้ไขเพื่อรวม bash ที่ติดตั้งมาให้ มิฉะนั้น (อย่างน้อยในเครื่องของฉัน) เทอร์มินัลจะปฏิเสธที่จะเริ่มต้น
brendanjerwin

2
คำสั่งที่สาม (csh -s) ดูเหมือนจะไม่จำเป็นอีกต่อไปใน Mavericks 10.9.2
Brent Faust

2
ฉันแค่ต้องbrew install bashทำสิ่งนี้ให้ได้ (เช่นไม่ต้องแก้ไข/etc/shells)
Daniel

4

ฉันอาจจะผิดที่นี่ แต่เท่าที่ฉันรู้ว่าbrewจะติดตั้งมันเป็นตัวอย่างของตัวเองbashตั้งแต่ชงทำงานภายใต้/usr/local/binในขณะที่ค่าเริ่มต้นระบบการทำงานภายใต้/bin(และ/usr/bin)

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

หวังว่ามันจะช่วย!

BTW: สำรองข้อมูล! คำแนะนำที่ดีที่สุดในสถานการณ์นี้!


เฮ้คุณรู้ไหมคำตอบนี้ใช้งานได้ดีจริง ๆ เหมือนมีเสน่ห์
castiel

0

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

sudo cp /bin/bash /bin/bash.3.2.bk

จากนั้นสร้าง symlink ให้กับ bash ที่สามารถเรียกทำงานได้ซึ่ง Homebrew ดาวน์โหลด ฉันคิดว่ามันจะอยู่ใน / usr / local / Cellar เช่นนั้น

sudo ln -s /usr/local/Cellar/bash/4.2.10/bin/bash /bin/bash

ตอนนี้ / bin / bash ชี้ไปที่ไฟล์ในไดเรกทอรี usr / local ของคุณ


3
ข้อเสียของการ plopping ทุบตีใหม่สำหรับรุ่นของระบบคือการปรับปรุงใด ๆ ของระบบปฏิบัติการสามารถลบเชลล์ที่คุณต้องการ สมมุติว่า OP ต้องการใช้คุณสมบัติใหม่ซึ่งอาจแตกหากระบบปฏิบัติการติดตั้ง "ใหม่กว่าระบบปฏิบัติการเก่า" แต่ทุบตีเวอร์ชัน "เก่ากว่ากำหนดเอง" ดีกว่าที่จะเปลี่ยนเส้นทางเริ่มต้นหรือเปลี่ยนตัวแปรเชลล์ผู้ใช้
bmike

ดีคุณสามารถสร้างลิงค์ใหม่ได้เพราะมันจะไม่เขียนทับเวอร์ชันของ bash ในไดเรกทอรี usr / local ของคุณ แต่คุณถูกต้องวิธีของดาเนียลนั้นดีกว่า
lemonginger

Ooh - แก้ไขคำตอบของคุณก่อนอื่น (และเก็บความคิดเดิมไว้หากคุณต้องการเป็นทางเลือกที่สอง - ฉันชอบที่ดีกว่านี้มากและชอบที่จะมีโอกาสย้อนกลับการโหวตของฉัน :-)
bmike

1
อืมนั่นคือ / เป็น / สิ่งที่ฉันพูด แต่ฉันแก้ไขเพื่อพยายามอธิบายสิ่งที่แต่ละขั้นตอนทำได้ดีกว่าเล็กน้อย ยังคงคิดว่าคำตอบที่ติดอันดับต้น ๆ น่าจะดีกว่า :) :)
lemonginger

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

0

ฉันคิดว่ามันปลอดภัยถ้าคุณเพิ่งเปิดตัว

brew install bash

จากนั้นเพิ่มเป็นเปลือกเริ่มต้นของคุณ

chsh -s /usr/local/bin/bash

เนื่องจากคุณกำลังแก้ไขผู้ใช้ปัจจุบันของคุณเท่านั้น แต่ผมสังเกตเห็นว่าเริ่มต้นของฉัน~ / .profileคือ

if [ "/bin/bash" == $BASH ]; then
    source ~/.bashrc
fi

ดังนั้นจึงต้องมีการอัพเดท ฉันเปลี่ยนเป็น

if [ "bash" == $(basename $BASH) ]; then
        source ~/.bashrc
fi

ดูคำตอบอื่น ๆ ว่าทำไมchshคนเดียวไม่พอ นอกจากนี้ยังเป็นข้อมูลโค้ด. profile ที่อัปเดตของคุณซึ่งมีลักษณะเหมือนของเดิม
nohillside

@patrix: ขอบคุณที่ชี้ให้เห็นฉันได้อัปเดตข้อมูลโค้ดที่สอง มันคงจะดีถ้าbrew install bashไม่ต้องการการดำเนินการใด ๆ เพิ่มเติม ด้วยโปรไฟล์ที่อัปเดตที่ฉันแบ่งปันไม่ทำเช่นนั้น ฉันหวังว่านี่จะช่วยผู้อื่นได้
Gianluca Casati
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.