Cập nhật bash lên phiên bản 4.0 trên OSX


81

Có thể thực sự cập nhật bash lên phiên bản 4.0 trong OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Bài viết nàychủ đề này đề cập đến cùng một câu hỏi, nhưng họ cài đặt một vỏ mới song song với cái cũ. Có cách nào để cập nhật trực tiếp shell bash cũ không?


3
Không cần phải làm điều đó. Trong thực tế, nó luôn luôn là một ý tưởng tốt để giữ bản gốc. Hai hoặc nhiều phiên bản bash có thể được cài đặt cùng một lúc và bạn có thể đặt bất kỳ phiên bản nào bạn muốn làm mặc định
lupincho

Về cơ bản, Cập nhật phần mềm của Apple sẽ chịu trách nhiệm thay đổi phiên bản BASH trên hệ thống, giống như đã cập nhật với BASH cho Shellshock. Vì vậy, trừ khi Apple cung cấp bản cập nhật thì không có cách trực tiếp nào để cập nhật lên phiên bản GNU BASH mới nhất được cài đặt như một phần của OS X. Một cách gián tiếp sẽ là tự tải xuống, bằng cách này hay cách khác, và cài đặt nó và sau đó đặt nó làm vỏ mặc định của bạn. Cho dù bạn có chọn loại bỏ phiên bản giao hàng hay phiên bản cập nhật của Apple hay không, điều đó tùy thuộc vào bạn.
dùng3439894

Câu trả lời:


36

Apple sẽ không cập nhật Bash, vì phiên bản mới nhất được cấp phép theo GPLv3, thứ mà Apple không thể sử dụng. Họ đã cập nhật hầu hết các vỏ khác của họ mặc dù. Ví dụ, ZSH chủ yếu được cập nhật.

Người giới thiệu:

Sau một chút nghiên cứu, đây có vẻ như là vấn đề chính:

Khi mọi người phân phối Sản phẩm người dùng bao gồm phần mềm theo GPLv3, phần 6 yêu cầu họ cung cấp cho bạn thông tin cần thiết để sửa đổi phần mềm đó. Sản phẩm người dùng là một thuật ngữ được xác định đặc biệt trong giấy phép; ví dụ về Sản phẩm Người dùng bao gồm máy nghe nhạc di động, máy ghi video kỹ thuật số và hệ thống an ninh gia đình.

Điều này sẽ yêu cầu phần mềm nguồn đóng khác, các phần GPL của nó phải được sửa đổi bởi công chúng, điều này rõ ràng sẽ là một vấn đề đối với Apple.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
bmike

5
Giải thích này không có ý nghĩa. Vận chuyển nhị phân GPL (v3 hoặc cách khác) không có nghĩa là phần còn lại của HĐH sẽ cần được phát hành. Phần còn lại của hệ điều hành không liên kết đến bash. Mệnh đề "Tivoization" có thể giải thích tại sao bashkhông thể cập nhật trên Apple TV, nhưng không thực sự trên máy tính để bàn Mac. Hơn nữa, "các phần của GPL" sẽ cần phải được sửa đổi bởi công chúng; v3 sẽ không thay đổi điều đó. Tôi tin rằng điều khoản bằng sáng chế của GPL v3 sẽ đủ để ngăn Apple chạm vào mã GPL v3.
jamesdlin

Tại sao điều đó sẽ là một vấn đề cho Apple? Bash đã là nguồn mở (tất cả các phiên bản .141,14 đều có sẵn thông qua GNU @ ftp.gnu.org/gnu/bash và phiên bản có kèm theo macOS (hiện tại là phiên bản 3.2) có sẵn thông qua Apple @ opensource.apple.com/source/bash ), nhưng nó có thể được sửa đổi bất kể.
lên tiếng

@ tjt263 Đó là về sự khác biệt giữa GPLv3 và GPLv2, phiên bản mà Apple sử dụng, vẫn được cấp phép theo.
William T Froggard

3
Phải, Bash3.2 được cấp phép theo GPLv2. Bash4.x được cấp phép theo GPLv3. Vậy thì sao? Bạn nói: "Apple sẽ không cập nhật Bash, vì phiên bản mới nhất được cấp phép theo GPLv3, thứ mà Apple không thể sử dụng ." Tại sao họ không thể? "Điều này sẽ yêu cầu phần mềm nguồn đóng khác, các phần GPL của nó phải được sửa đổi bởi công chúng , điều này rõ ràng sẽ là một vấn đề đối với Apple ." Tại sao đó là một vấn đề? Họ đã làm điều đó rồi. Nó đã được sửa đổi bởi công chúng. Tất cả phần mềm là. Đặc biệt là khi nó FOSS và họ đang tặng mã nguồn trên trang web của họ cho bất kỳ ai muốn nó.
lên tiếng

62

Có thể thực sự cập nhật bash lên phiên bản 4.0 trong OSX Yosemite? Đúng.

  1. Tải xuống / Cài đặt homebrew http://brew.sh/ bằng cách chạy lệnh này trong terminal.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Thoát và mở lại thiết bị đầu cuối của bạn. sau đó gõ

    brew install bash
  3. Thay đổi shell mặc định thông qua gui cuối cùng với đường dẫn theo nghĩa đen của bash mới của bạn (EDIT: Tôi vẫn chưa tìm thấy cách CLI hoạt động)

nhập mô tả hình ảnh ở đây

Có thể thực sự cập nhật bash lên phiên bản bash 4.0 do Apple cung cấp trong OSX Yosemite không?

EDIT: Không. Không phải theo cách mà op đang hỏi. Ví dụ: nâng cấp cài đặt hiện tại bằng cách thay thế chính nó. Nó đã được ghi nhận trong các câu trả lời khác rằng Apple đã không cập nhật bash do vấn đề cấp phép. Tuy nhiên, tải xuống một phiên bản bash cập nhật và riêng biệt và sử dụng nó làm vỏ mặc định của bạn là giải pháp chính tắc, cho hầu hết các thông dịch viên. Lấy trăn làm ví dụ. Bạn không nâng cấp 2.7 lên 3.5, bạn tải xuống một phiên bản riêng và thay đổi mặc định.


12
Bạn có thể đặt mặc định qua CLI bằng : sudo chpass -s /usr/local/bin/bash. Lưu ý: Tốt nhất là chỉ đến liên kết tượng trưng /usr/local/bin/theo cách mà Brew có thể xử lý các nâng cấp mà không phải thay đổi môi trường của bạn mỗi lần.
sansSpoon

3
những rủi ro khi đi với vỏ không phải của Apple là gì?
Người hâm mộ số một của Bjork

5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'sau đó chsh -s /usr/local/bin/bashsẽ đặt shell mặc định cho thiết bị đầu cuối
Abhijit Sarkar

51

Như @William đã nói trong câu trả lời của mình, Apple không cung cấp bash 4 do hạn chế GPL. Tuy nhiên, bạn có thể cài đặt bash 4+ và cũng có thể biến nó thành vỏ mặc định của bạn (bao gồm cả Terminal và iTerm2 ) bằng cách thực hiện như sau.

Cài đặt Bash 4 qua Homebrew

Đầu tiên cài đặt phiên bản mới hơn của bash. Có nhiều cách khác nhau để làm điều đó, tôi thích Homebrew hơn.

  • Cài đặt Homebrew như được mô tả tại http://brew.sh .
  • Cài đặt bash bằng cách sử dụng brew install bash.

Bash 4 hiện có sẵn trên PATH của bạn (giả sử thùng Homebrew nằm trên đường của bạn). Tuy nhiên, nó chưa phải là vỏ mặc định của bạn. Bạn có thể tìm thấy nó nằm ở đâu bằng cách chạy which bash. Trong trường hợp của tôi đó là tại /usr/local/bin/bash.

Sử dụng Bash 4

Vì nó nằm trên PATH của bạn, bạn có thể bắt đầu phiên Bash 4 chỉ bashhoặc nó có thể được sử dụng trong các tập lệnh bằng cách sử dụng Shebang .

Ví dụ, điều này sẽ sử dụng một ví dụ bash cụ thể.

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

Điều này sẽ sử dụng bash đầu tiên trên PATH.

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

Bạn cũng có thể đặt đường dẫn bash cho các cấu hình cụ thể trong Terminal / iTerm2 bằng các bước được mô tả trong câu trả lời của @ user136952.

Đặt Bash 4 làm mặc định

Như đã đề cập ở trên, sau khi cài đặt Bash 4 vẫn không phải là shell mặc định. Để làm bash mặc định, bạn cần thực hiện thêm hai bước nữa.

Đầu tiên, thêm đường dẫn Bash 4 vào /etc/shellstệp của bạn để nó là vỏ đăng nhập được phép. Như được mô tả trong / etc / shells , tệp này có danh sách các shell đăng nhập hợp lệ. Sau khi thêm đường dẫn bash mới, giao diện của tôi /etc/shellsnhư sau:

# 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

Tiếp theo chúng tôi sử dụng chsh để biến nó thành shell mặc định của bạn. Vì vậy, bất kỳ phiên nào cho người dùng đó sẽ sử dụng shell đó. Bạn có thể đọc thêm về điều này trong Change the Shell trong Mac OS X Terminal , nhưng lệnh thực tế rất đơn giản.

chsh -s /usr/local/bin/bash

Bây giờ bash mới là vỏ đăng nhập mặc định của chúng tôi. Nếu bạn mở Terminal hoặc iTerm2 và chạy, bash --versionbạn sẽ thấy phiên bản mới. Lưu ý "Giấy phép GPLv3 +", đó là lý do tại sao Apple không gói nó với 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
Dựa trên bài viết / chủ đề anh ấy liên kết với tôi nghĩ anh ấy thực sự có nghĩa là "không mặc định" bằng cách nói không bên cạnh nhau. Câu trả lời của tôi làm cho 4 mặc định để 3 không còn được nhìn thấy. Việc bash cũ xảy ra vẫn chiếm một số dung lượng đĩa dường như không phải là vấn đề lớn đối với tôi.
studgeek

1
+1 bởi tôi. Có, OP không muốn điều này, nhưng câu hỏi thuộc về cộng đồng và nếu điều này giúp người khác, thật tuyệt vời. Nó có thể không nhận được kiểm tra như câu trả lời mà OP chọn, nhưng điều đó không làm cho nó trở thành một câu trả lời tồi.
bmike

3
Trên High Sierra, chỉ sudo chpass -s /usr/local/bin/bashthay đổi shell của tôi cho root / sudo . Để thay đổi cho đăng nhập thường xuyên của tôi, tôi phải chạy lệnh mà không có sudo. Đây có thể là một điều Active Directory; Tôi không chắc.
Bradd Szonye

1
Thay vì sử dụng #!/usr/local/bin/bashshebang, hãy xem xét sử dụng #!/usr/bin/env bash( giải thích ). Điều này sẽ chạy tập lệnh với bất kỳ phiên bản bash nào có thể truy cập được bởi môi trường khởi chạy tập lệnh, tức là bất cứ điều gì which bashtrả về. Đó là một giải pháp di động hơn sử dụng các đường dẫn cụ thể. Chúng tôi không thể mong đợi người dùng khác cài đặt bash thông qua homebrew.
Illya Moskvin

1
@IllyaMoskvin, ban đầu tôi đã sử dụng một đường dẫn cụ thể vì tôi muốn chỉ ra cách sử dụng nó một cách rõ ràng. Tôi đã cập nhật các ví dụ để có cả hai.
studgeek

0

Bạn có thể cài đặt phiên bản Bash khác mà không cần homebrew

  • Chuyển đến GNU Bash
  • Tải xuống phiên bản bạn muốn ( tại đây )
  • Và làm theo các bước ở đây: https://gist.github.com/samnang/1759336

    Tải xuống và cài đặt phiên bản bash bạn muốn Thay thế XX (trong bash-XX) với phiên bản bạn muốn, ví dụ: 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
    

    Thêm shell mới vào danh sách shell hợp pháp

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

    Thay đổi vỏ cho người dùng

    chsh -s /usr/local/bin/bash

    Kiểm tra Bash 4 và / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Bạn có thể muốn thêm một bí danh nếu bạn muốn lệnh bash sử dụng nó. Đặt trong ~ / .bash_profile của bạn

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

-1

Cài đặt song song với bản cập nhật cho trình bao của bạn (thông qua chsh hoặc GUI) sẽ không thành công cho các tập lệnh. Các tập lệnh thường sử dụng env bash, hoàn nguyên về phiên bản bash OS X. Vì vậy, những gì bạn muốn có thể không phải là bản cập nhật hoàn chỉnh của bash, mà là bản cài đặt song song luôn trả về phiên bản bash mới hơn (tức là ngay cả khi envđược gọi).

Vì vậy, để xử lý việc này:

1) cài đặt bash qua Homebrew, như các bình luận viên khác đã đăng

2) đặt vỏ đăng nhập của bạn thành phiên bản mới này (thông qua lệnh GUI hoặc chsh như những người khác đã đăng)

3) đặt /usr/local/bin(hoặc đường dẫn đến phiên bản bash mới) trước /binbiến $ PATH của bạn, bằng cách thêm giá trị này vào ~/.bash_profile:export PATH=/usr/local/bin:$PATH


Điều này sẽ phá vỡ các tập lệnh mong đợi bash phiên bản 3 - tức là các tập lệnh do Apple cung cấp - bạn cần sử dụng sde by side
user151019

Một điểm công bằng. Đã chạy như thế này một thời gian và không có vấn đề. Có thể Apple cung cấp đường dẫn đầy đủ trong các tập lệnh của nó hoặc nó không gặp trở ngại nào. Đối với các kịch bản cấp hệ thống của apple, tức là không phải từ trình bao, nó không bao giờ gọi lệnh .bash_profilenào, vì vậy nó sẽ chỉ ảnh hưởng đến thứ bạn chạy trực tiếp trong một thiết bị đầu cuối.
cwingrav

2
@Mark Tôi không thể nghĩ ra một trường hợp trong đó v 4.x sẽ phá vỡ một tập lệnh được viết cho v ≤3.x. Bạn có thể?
lên tiếng

-1

2019: Đơn giản như trong bài này

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

sau đó tab một thiết bị đầu cuối mới, thưởng thức!


1
Ai xuống bình chọn câu trả lời của tôi mà không có lời giải thích?
Feuda
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.