อัปเดต bash เป็นเวอร์ชั่น 4.0 บน OSX


80

เป็นไปได้หรือไม่ที่จะอัปเดต bash เป็นเวอร์ชัน 4.0 ใน OSX Yosemite

echo $BASH_VERSION
3.2.57(1)-release

นี้บทความนี้และด้ายอ้างถึงคำถามเดียวกัน แต่พวกเขาติดตั้งเปลือกใหม่เคียงข้างกับคนเก่า มีวิธีอัปเดตเชลล์ bash เก่าโดยตรงหรือไม่


3
ไม่จำเป็นต้องทำเช่นนั้น ในความเป็นจริงมันเป็นความคิดที่ดีเสมอที่จะเก็บต้นฉบับ สามารถติดตั้ง bash ได้สองเวอร์ชั่นขึ้นไปในเวลาเดียวกันและคุณสามารถตั้งค่าใดก็ได้ที่คุณต้องการให้เป็นค่าเริ่มต้น
lupincho

โดยพื้นฐานแล้วการอัปเดตซอฟต์แวร์ของ Apple จะรับผิดชอบการเปลี่ยนแปลงเวอร์ชันของ BASH ในระบบเช่นเดียวกับที่ทำกับการอัปเดตเป็น BASH สำหรับ Shellshock ดังนั้นถ้า Apple ไม่มีการอัพเดทดังนั้นจึงไม่มีวิธีโดยตรงในการอัปเดต GNU BASH เวอร์ชันล่าสุดที่ติดตั้งเป็นส่วนหนึ่งของ OS X วิธีทางอ้อมคือการดาวน์โหลดด้วยตัวคุณเองโดยใช้วิธีใดวิธีหนึ่งแล้วติดตั้งและ จากนั้นตั้งเป็นเปลือกเริ่มต้นของคุณ ไม่ว่าคุณจะเลือกที่จะลบเวอร์ชันที่จัดส่งหรือเวอร์ชั่นที่อัปเดตของ Apple หรือไม่นั้นขึ้นอยู่กับคุณ
user3439894

คำตอบ:


36

Apple จะไม่อัปเดต Bash เนื่องจากเวอร์ชันล่าสุดได้รับลิขสิทธิ์ภายใต้ GPLv3 ซึ่ง Apple ไม่สามารถใช้ได้ พวกเขาได้อัพเดทเชลล์ส่วนใหญ่แล้ว ตัวอย่างเช่น ZSH ส่วนใหญ่เป็นข้อมูลล่าสุด

อ้างอิง:

หลังจากการวิจัยเล็กน้อยดูเหมือนว่าจะเป็นปัญหาหลัก:

เมื่อผู้คนแจกจ่ายผลิตภัณฑ์ของผู้ใช้ที่มีซอฟต์แวร์ภายใต้ GPLv3 ส่วนที่ 6 กำหนดว่าพวกเขาจะต้องให้ข้อมูลที่จำเป็นสำหรับการแก้ไขซอฟต์แวร์นั้นแก่คุณ ผลิตภัณฑ์ของผู้ใช้เป็นคำที่กำหนดไว้เป็นพิเศษในใบอนุญาต ตัวอย่างของผลิตภัณฑ์ของผู้ใช้ ได้แก่ เครื่องเล่นเพลงพกพาเครื่องบันทึกวิดีโอดิจิตอลและระบบรักษาความปลอดภัยภายในบ้าน

สิ่งนี้จะต้องมีซอฟต์แวร์ที่เป็นแหล่งปิดมิฉะนั้นต้องมีส่วนของ GPL ที่สามารถแก้ไขได้โดยสาธารณะซึ่งเห็นได้ชัดว่าจะเป็นปัญหาสำหรับ Apple


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
bmike

5
คำอธิบายนี้ไม่สมเหตุสมผล การจัดส่งไบนารี GPL (v3 หรืออย่างอื่น) ไม่ได้หมายความว่าส่วนที่เหลือของระบบปฏิบัติการจะต้องได้รับการปล่อยตัว ส่วนที่เหลือของระบบปฏิบัติการไม่ได้เชื่อมโยงbashไปยัง ประโยค "Tivoization" อาจอธิบายได้ว่าทำไมbashไม่สามารถอัพเดทบน Apple TV ได้ แต่ไม่ใช่บนเดสก์ท็อป Mac นอกจากนี้ "GPL'd ส่วน" จะต้องได้รับการแก้ไขโดยสาธารณะ v3 จะไม่เปลี่ยนแปลงสิ่งนั้น ฉันเชื่อว่าคำสั่งสิทธิบัตรของ GPL v3 นั้นเพียงพอที่จะป้องกันไม่ให้ Apple แตะรหัส GPL v3
jamesdlin

ทำไมถึงเป็นปัญหาสำหรับ Apple? Bash เป็นโอเพ่นซอร์สแล้ว (ทุกเวอร์ชั่น≥1.14มีให้บริการผ่าน GNU @ ftp.gnu.org/gnu/bashและรุ่นที่มาพร้อมกับ macOS (ปัจจุบัน v3.2) มีให้บริการผ่าน Apple @ opensource.apple.com/source/bash ) แต่มันสามารถแก้ไขได้โดยไม่คำนึงถึง
เสียง

@ tjt263 เกี่ยวกับความแตกต่างระหว่าง GPLv3 และ GPLv2 ซึ่งเป็นรุ่นที่ Apple ใช้อยู่
William T Froggard

3
ขวา Bash3.2 ได้รับอนุญาตภายใต้ GPLv2 Bash4.x ได้รับอนุญาตภายใต้ GPLv3 แล้วอะไรล่ะ คุณกล่าวว่า: "Apple จะไม่อัปเดต Bash เนื่องจากเวอร์ชันล่าสุดได้รับอนุญาตภายใต้ GPLv3 ซึ่งApple ไม่สามารถใช้งานได้" ทำไมถึงทำไม่ได้ "สิ่งนี้จะต้องมีซอฟต์แวร์ที่เป็นแหล่งปิดมิฉะนั้นซอฟต์แวร์ GPL จะทำให้ส่วนสาธารณะสามารถแก้ไขได้ซึ่งจะเห็นได้ชัดว่าเป็นปัญหาสำหรับ Apple " ทำไมถึงเป็นปัญหา? พวกเขาทำเช่นนั้นแล้ว แก้ไขได้โดยสาธารณะแล้ว ซอฟต์แวร์ทั้งหมดคือ โดยเฉพาะอย่างยิ่งเมื่อเป็น FOSS และพวกเขากำลังแจกซอร์สโค้ดบนเว็บไซต์ให้กับทุกคนที่ต้องการ
เสียง

62

เป็นไปได้หรือไม่ที่จะอัปเดต bash เป็นเวอร์ชัน 4.0 ใน OSX Yosemite ใช่.

  1. ดาวน์โหลด / ติดตั้ง homebrew http://brew.sh/ โดยใช้คำสั่งนี้ในเทอร์มินัล

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. ปิดและเปิด Terminal ของคุณใหม่ จากนั้นพิมพ์

    brew install bash
  3. เปลี่ยนเชลล์เริ่มต้นผ่านเทอร์มินัล gui ด้วยพา ธ ตัวอักษรของ bash ใหม่ของคุณ (แก้ไข: ฉันยังไม่พบวิธี CLI ที่ใช้งานได้)

ป้อนคำอธิบายรูปภาพที่นี่

เป็นไปได้หรือไม่ที่จะอัปเดต bash เป็นApple ที่จัดเตรียม bashเวอร์ชัน 4.0 ใน OSX Yosemite

แก้ไข: ไม่ไม่ทาง op ถาม. เช่นอัพเกรดการติดตั้งปัจจุบันโดยวิธีการแทนที่ตัวเอง มีการบันทึกไว้ในคำตอบอื่น ๆ ที่ Apple ยังไม่ได้ปรับปรุงทุบตีเนื่องจากปัญหาการออกใบอนุญาต อย่างไรก็ตามการดาวน์โหลดเวอร์ชันทุบตีที่อัปเดตและแยกต่างหากและใช้เป็นเชลล์เริ่มต้นของคุณคือโซลูชันที่เป็นที่ยอมรับสำหรับนักแปลส่วนใหญ่ ใช้ไพ ธ อนเป็นตัวอย่าง คุณไม่ได้อัพเกรด 2.7 เป็น 3.5 คุณดาวน์โหลดเวอร์ชันแยกต่างหากและเปลี่ยนค่าเริ่มต้น


12
คุณสามารถตั้งค่าเริ่มต้นผ่าน CLI sudo chpass -s /usr/local/bin/bashกับ: หมายเหตุ: เป็นการดีที่สุดที่จะชี้ไปที่ symlink ใน/usr/local/bin/ลักษณะที่ Brew สามารถจัดการกับการอัพเกรดได้โดยไม่ต้องเปลี่ยนสภาพแวดล้อมของคุณในแต่ละครั้ง
sansSpoon

3
ความเสี่ยงที่จะเกิดขึ้นกับเชลล์ที่ไม่ใช่ของ Apple มีอะไรบ้าง
แฟนคลับหมายเลขหนึ่งของ Bjorks

5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'จากนั้นchsh -s /usr/local/bin/bashจะตั้งค่าเปลือกเริ่มต้นสำหรับเทอร์มินัล
Abhijit Sarkar

51

ตามที่ @William กล่าวในคำตอบของเขา Apple ไม่ได้จัดเตรียม bash 4 เนื่องจากข้อ จำกัด ของ GPL คุณสามารถติดตั้ง bash 4+ และยังสามารถทำให้มันเป็นเชลล์เริ่มต้นของคุณ (รวมถึง Terminal และiTerm2 ) โดยทำดังต่อไปนี้

ติดตั้ง Bash 4 ผ่าน Homebrew

ก่อนอื่นให้ติดตั้ง bash เวอร์ชันที่ใหม่กว่า มีหลายวิธีในการทำเช่นนั้นฉันชอบ Homebrew

  • ติดตั้ง Homebrew ตามที่อธิบายไว้ในhttp://brew.sh
  • brew install bashติดตั้งทุบตีใช้

ตอนนี้ Bash 4 พร้อมใช้งานบน PATH ของคุณแล้ว (สมมติว่า Homebrew bin อยู่บนเส้นทางของคุณ) อย่างไรก็ตามมันยังไม่เป็นเชลล์เริ่มต้นของคุณ which bashคุณสามารถค้นหาที่เป็นอยู่โดยการทำงาน /usr/local/bin/bashในกรณีของฉันมันอยู่ที่

ใช้ Bash 4

เพราะมันอยู่บนเส้นทางของคุณคุณสามารถเริ่มทุบตี 4 เซสชั่นที่มีเพียงbashหรือสามารถนำมาใช้ในสคริปต์โดยใช้shebang

ตัวอย่างเช่นนี้จะใช้อินสแตนซ์ทุบตีที่เฉพาะเจาะจง

#!/usr/local/bin/bash
...your script...

นี่จะใช้ bash แรกบน PATH

#!/usr/bin/env bash
...your script...

คุณสามารถตั้งค่า bash path สำหรับโปรไฟล์เฉพาะใน Terminal / iTerm2 โดยใช้ขั้นตอนที่อธิบายไว้ในคำตอบของ @ user136952

ทำให้ Bash 4 เป็นค่าเริ่มต้น

ดังกล่าวข้างต้นหลังจากติดตั้ง Bash 4 ยังคงไม่ใช่เปลือกเริ่มต้น หากต้องการทุบตีค่าเริ่มต้นคุณต้องทำสองขั้นตอนเพิ่มเติม

ขั้นแรกให้เพิ่มพา ธ Bash 4 ลงใน/etc/shellsไฟล์ของคุณเพื่อให้เป็นเชลล์ล็อกอินที่อนุญาต ดังที่อธิบายไว้ใน/ etc / shellsไฟล์นี้มีรายการเชลล์ล็อกอินที่ถูกต้อง หลังจากเพิ่มเส้นทางทุบตีใหม่ของฉัน/etc/shellsดูเหมือนว่าต่อไปนี้:

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/bash

ต่อไปเราจะใช้ chsh เพื่อทำให้มันเป็นเปลือกเริ่มต้นของคุณ ดังนั้นเซสชันใด ๆ สำหรับผู้ใช้นั้นจะใช้เชลล์นั้น คุณสามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ในChange the Shell ใน Mac OS X Terminalแต่คำสั่งจริงนั้นตรงไปตรงมามาก

chsh -s /usr/local/bin/bash

ตอนนี้ทุบตีใหม่คือเปลือกเข้าสู่ระบบเริ่มต้นของเรา หากคุณเปิด Terminal หรือ iTerm2 และเรียกใช้bash --versionคุณจะเห็นเวอร์ชั่นใหม่ จดบันทึก "สิทธิ์การใช้งาน GPLv3 +" ซึ่งเป็นเหตุผลที่ Apple ไม่ได้รวมกับ macOS

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.6.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

2
จากบทความ / เธรดที่เขาเชื่อมโยงกับฉันคิดว่าเขาหมายถึง "ไม่ใช่ค่าเริ่มต้น" โดยพูดว่าไม่ใช่แบบเคียงข้างกัน คำตอบของฉันทำให้ 4 เป็นค่าเริ่มต้นดังนั้น 3 จะไม่เห็นอีกต่อไป ความจริงที่ว่าทุบตีเก่านั้นยังคงกินพื้นที่ว่างในดิสก์ไม่ดูเหมือนเป็นปัญหาใหญ่สำหรับฉัน
studgeek

1
+1 โดยฉัน ใช่ OP ไม่ต้องการสิ่งนี้ แต่คำถามเป็นของชุมชนและหากสิ่งนี้ช่วยคนอื่นได้ อาจไม่ได้รับการตรวจสอบเนื่องจากคำตอบที่ OP เลือก แต่นั่นไม่ได้ทำให้คำตอบไม่ถูกต้อง
bmike

3
บน High Sierra sudo chpass -s /usr/local/bin/bashเปลี่ยน shell ของฉันเป็น root / sudo เท่านั้น sudoการเปลี่ยนเพื่อเข้าสู่ระบบปกติของฉันฉันต้องเรียกใช้คำสั่งโดยไม่ต้อง นี่อาจเป็นสิ่ง Active Directory ฉันไม่แน่ใจ.
Bradd Szonye

1
แทนที่จะใช้#!/usr/local/bin/bashShebang ให้ดูที่การใช้#!/usr/bin/env bash( คำอธิบาย ) นี้จะเรียกใช้สคริปต์กับสิ่งที่รุ่นของทุบตีสามารถเข้าถึงได้จากสภาพแวดล้อมที่เปิดตัวสคริปต์คือสิ่งที่which bashผลตอบแทน มันเป็นโซลูชันแบบพกพาที่ใช้เส้นทางเฉพาะ เราไม่สามารถคาดหวังให้ผู้ใช้รายอื่นติดตั้ง bash ผ่าน homebrew
Illya Moskvin

1
@IllyaMoskvin ฉันใช้เส้นทางเฉพาะเนื่องจากฉันต้องการแสดงวิธีใช้อย่างชัดเจน ฉันได้อัปเดตตัวอย่างเพื่อให้มีทั้งสองอย่าง
studgeek

0

คุณสามารถติดตั้ง Bash เวอร์ชันอื่นโดยไม่ใช้ homebrew

  • ไปที่GNU Bash
  • ดาวน์โหลดเวอร์ชั่นที่คุณต้องการ ( ที่นี่ )
  • และทำตามขั้นตอนที่นี่: https://gist.github.com/samnang/1759336

    ดาวน์โหลดและติดตั้งเวอร์ชั่นทุบตีที่คุณต้องการแทนที่ XX (ใน bash-XX) ด้วยรุ่นที่คุณต้องการเช่น 4.4

    curl -O http://ftp.gnu.org/gnu/bash/bash-X.X.tar.gz
    tar xzf bash-X.X.tar.gz
    cd bash-X.X
    ./configure --prefix=/usr/local && make && sudo make install

    เพิ่มเชลล์ใหม่ลงในรายการเชลล์ที่ถูกต้อง

    sudo bash -c "echo /usr/local/bin/bash >> /private/etc/shells"

    เปลี่ยนเชลล์สำหรับผู้ใช้

    chsh -s /usr/local/bin/bash

    ตรวจสอบ Bash 4 และ / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    คุณอาจต้องการเพิ่มนามแฝงหากคุณต้องการให้คำสั่ง bash ใช้งาน วางใน ~ / .bash_profile ของคุณ

    alias bash="/usr/local/bin/bash"

-1

การติดตั้งแบบเคียงข้างกันพร้อมกับการอัปเดตเชลล์ของคุณ (ผ่าน chsh หรือ GUI) จะล้มเหลวสำหรับสคริปต์ สคริปต์มักจะใช้env bashซึ่งแปลงกลับไปเป็นเวอร์ชั่นทุบตี OS X ดังนั้นสิ่งที่คุณต้องการอาจไม่ใช่การอัปเดตอย่างสมบูรณ์ของ bash แต่การติดตั้งแบบเคียงข้างกันนั้นจะส่งคืนเวอร์ชันที่ใหม่กว่าของ bash (เช่นแม้ว่าenvจะถูกเรียกใช้)

ดังนั้นเพื่อจัดการกับสิ่งนี้:

1) ติดตั้ง bash ผ่าน Homebrew ตามที่คนอื่น ๆ โพสต์ไว้

2) ตั้งค่าล็อกอินเชลล์เป็นเวอร์ชั่นใหม่นี้ (ผ่านคำสั่ง GUI หรือ chsh เหมือนที่คนอื่น ๆ โพสต์ไว้)

3) ตั้งค่า/usr/local/bin(หรือเส้นทางไปยังเวอร์ชั่นทุบตีใหม่) ล่วงหน้าของ/binตัวแปร $ PATH ของคุณโดยเพิ่มสิ่งนี้ลงใน~/.bash_profile:export PATH=/usr/local/bin:$PATH


สิ่งนี้จะทำลายสคริปต์ที่คาดหวังว่าทุบตีเวอร์ชัน 3 - เช่นสคริปต์ของ Apple ที่ให้มา - คุณต้องใช้ sde เคียงข้างกัน
user151019

จุดยุติธรรม ทำงานแบบนี้มาซักพักแล้วก็ไม่มีปัญหา บางที Apple อาจให้เส้นทางแบบเต็มในสคริปต์ของมันหรือไม่เพิ่งถูกอุปสรรค์ สำหรับสคริปต์ระดับระบบแอปเปิ้ลคือไม่ได้มาจากเปลือกมันไม่เคยเรียก.bash_profileมันดังนั้นมันจะส่งผลกระทบต่อบางสิ่งที่คุณเรียกใช้ในเทอร์มินัลเท่านั้น
cwingrav

2
@ Mark ฉันไม่สามารถนึกถึงอินสแตนซ์ที่ v ≥4.xจะทำลายสคริปต์ที่เขียนขึ้นสำหรับ v ≤3.x คุณสามารถ?
เสียง

-1

2019: เรียบง่ายเหมือนในโพสต์นี้

$ brew install bash
$ sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
$ chsh -s /usr/local/bin/bash

จากนั้นแท็บเทอร์มินัลใหม่สนุก!


1
ใครลงคะแนนให้คำตอบของฉันโดยไม่มีคำอธิบาย?
Feuda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.