Perbarui bash ke versi 4.0 di OSX

81

Apakah mungkin untuk benar-benar memperbarui bash ke versi 4.0 di OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Ini artikel dan ini benang merujuk pada pertanyaan yang sama, tetapi mereka memasang shell side-by-side baru dengan yang lama. Apakah ada cara untuk secara langsung memperbarui bash shell lama?

sluijs
sumber
3
Tidak perlu melakukan itu. Bahkan, selalu merupakan ide bagus untuk mempertahankan yang asli. Dua atau lebih versi bash dapat diinstal pada saat yang sama, dan Anda dapat mengatur yang mana yang Anda inginkan sebagai default
lupincho
Pada dasarnya Pembaruan Perangkat Lunak Apple akan bertanggung jawab untuk mengubah versi BASH pada sistem, seperti yang terjadi pada pembaruan ke BASH untuk Shellshock. Jadi kecuali Apple memberikan pembaruan maka tidak ada cara langsung untuk memperbarui ke versi terbaru GNU BASH yang diinstal sebagai bagian dari OS X. Cara tidak langsung adalah mengunduhnya sendiri, dengan satu atau lain cara, dan instal dan kemudian atur sebagai shell default Anda. Apakah Anda memilih untuk menghapus versi yang dikirim atau versi yang diperbarui Apple, itu terserah Anda.
user3439894

Jawaban:

36

Apple tidak akan memperbarui Bash, karena versi terbaru dilisensikan di bawah GPLv3, yang tidak dapat digunakan Apple. Mereka telah memperbarui sebagian besar cangkang mereka yang lain. ZSH misalnya kebanyakan up to date.

Referensi:

Setelah sedikit riset, ini sepertinya masalah utama:

Ketika orang-orang mendistribusikan Produk Pengguna yang menyertakan perangkat lunak di bawah GPLv3, bagian 6 mengharuskan mereka memberi Anda informasi yang diperlukan untuk memodifikasi perangkat lunak itu. Produk Pengguna adalah istilah yang didefinisikan secara khusus dalam lisensi; contoh Produk Pengguna termasuk pemutar musik portabel, perekam video digital, dan sistem keamanan rumah.

Ini akan membutuhkan perangkat lunak sumber tertutup, jika bagian GPL dibuat dimodifikasi oleh publik, yang jelas akan menjadi masalah bagi Apple.

William T Froggard
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
bmike
5
Penjelasan ini tidak masuk akal. Mengirim binari GPL (v3 atau lainnya) tidak berarti bahwa sisa OS perlu dirilis. Sisa OS tidak terhubung ke bash. Klausa "Tivoization" mungkin menjelaskan mengapa bashtidak dapat diperbarui pada, katakanlah, Apple TV, tetapi tidak benar-benar di desktop Mac. Lebih jauh, "bagian-bagian GPL" harus perlu dimodifikasi oleh publik; v3 tidak akan mengubahnya. Saya akan percaya bahwa klausa paten GPL v3 akan cukup untuk mencegah Apple dari menyentuh kode GPL v3.
jamesdlin
Mengapa itu menjadi masalah bagi Apple? Bash sudah open source (semua versi ≥1.14 tersedia melalui GNU @ ftp.gnu.org/gnu/bash & versi yang disertakan dengan macOS (saat ini v3.2) tersedia melalui Apple @ opensource.apple.com/source/bash ), tetapi dapat dimodifikasi tanpa memperhatikan.
Suara
@ tjt263 Ini tentang perbedaan antara GPLv3 dan GPLv2, yang versi Apple gunakan, masih berlisensi di bawah.
William T Froggard
3
Benar, Bash3.2 dilisensikan dengan GPLv2. Bash4.x dilisensikan dengan GPLv3. Terus? Anda berkata: "Apple tidak akan memperbarui Bash, karena versi terbaru dilisensikan di bawah GPLv3, yang tidak dapat digunakan Apple ." Kenapa mereka tidak bisa? "Ini akan mengharuskan perangkat lunak sumber tertutup, jika bagian GPL-nya dapat dimodifikasi oleh publik , yang jelas akan menjadi masalah bagi Apple ." Mengapa itu menjadi masalah? Mereka sudah melakukannya. Ini sudah bisa dimodifikasi oleh publik. Semua perangkat lunak. Terutama ketika itu FOSS dan mereka memberikan kode sumber di situs mereka kepada siapa pun yang menginginkannya.
Suara
62

Apakah mungkin untuk benar-benar memperbarui bash ke versi 4.0 di OSX Yosemite? Iya.

  1. Unduh / Instal homebrew http://brew.sh/ dengan menjalankan perintah ini di terminal.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Keluar dan buka kembali terminal Anda. lalu ketik

    brew install bash
  3. Ubah shell default melalui terminal gui dengan path literal dari bash baru Anda (EDIT: Saya belum menemukan cara CLI yang berfungsi)

masukkan deskripsi gambar di sini

Apakah mungkin untuk benar-benar memperbarui bash ke versi bash yang disediakan Apple 4.0 di OSX Yosemite?

EDIT: Tidak. Tidak seperti yang diminta op. Misalnya meng-upgrade instalasi saat ini dengan cara mengganti sendiri. Telah dicatat dalam jawaban lain bahwa Apple belum memperbarui bash karena masalah lisensi. Namun mengunduh versi bash yang diperbarui dan terpisah dan menggunakannya sebagai shell default Anda adalah solusi kanonik, bagi sebagian besar penerjemah. Ambil python misalnya. Anda tidak meningkatkan 2,7 ke 3,5 Anda mengunduh versi yang terpisah dan mengubah default Anda.

pengguna136952
sumber
12
Anda dapat mengatur default melalui CLI dengan: sudo chpass -s /usr/local/bin/bash. Catatan: Lebih baik arahkan ke symlink /usr/local/bin/agar Brew dapat menangani pemutakhiran tanpa harus mengubah lingkungan Anda setiap saat.
sansSpoon
3
apa risiko pergi dengan cangkang non-Apple?
Penggemar nomor satu Bjorks
5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'kemudian chsh -s /usr/local/bin/bashakan menetapkan shell default untuk terminal
Abhijit Sarkar
52

Seperti @William katakan dalam jawabannya, Apple tidak menyediakan bash 4 karena pembatasan GPL. Anda dapat menginstal bash 4+ dan juga dapat menjadikannya shell default Anda (termasuk untuk Terminal dan iTerm2 ) dengan melakukan hal berikut.

Instal Bash 4 melalui Homebrew

Pertama instal versi bash yang lebih baru. Ada berbagai cara untuk melakukan itu, saya lebih suka Homebrew.

  • Instal Homebrew sebagaimana dijelaskan di http://brew.sh .
  • Instal bash menggunakan brew install bash.

Bash 4 sekarang tersedia di PATH Anda (dengan anggapan Homebrew bin ada di jalur Anda). Namun, tidak belum shell default Anda. Anda dapat menemukan di mana letaknya dengan menjalankan which bash. Dalam kasus saya ini di /usr/local/bin/bash.

Menggunakan Bash 4

Karena ini ada di PATH Anda, Anda dapat memulai sesi Bash 4 hanya dengan bashatau dapat digunakan dalam skrip dengan menggunakan Shebang .

Misalnya, ini akan menggunakan contoh bash tertentu.

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

Ini akan menggunakan bash pertama pada PATH.

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

Anda juga dapat mengatur jalur bash untuk profil tertentu di Terminal / iTerm2 menggunakan langkah-langkah yang dijelaskan dalam jawaban @ user136952.

Menjadikan Bash 4 sebagai default

Seperti disebutkan di atas, setelah menginstal Bash 4 masih bukan shell default. Untuk menjadikan bash default, Anda perlu melakukan dua langkah lagi.

Pertama, tambahkan jalur Bash 4 ke /etc/shellsfile Anda sehingga itu adalah shell login yang diizinkan. Seperti dijelaskan di / etc / shells , file ini memiliki daftar shell login yang valid. Setelah menambahkan bash path baru, /etc/shellstampilannya seperti berikut:

# 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

Selanjutnya kita menggunakan chsh untuk menjadikannya shell default Anda. Jadi setiap sesi untuk pengguna itu akan menggunakan shell itu. Anda dapat membaca lebih lanjut tentang ini di Change the Shell di Mac OS X Terminal , tetapi perintah sebenarnya sangat mudah.

chsh -s /usr/local/bin/bash

Sekarang bash baru adalah shell login default kami. Jika Anda membuka Terminal atau iTerm2 dan menjalankan bash --versionAnda akan melihat versi baru. Perhatikan "Lisensi GPLv3 +" yang mengapa Apple tidak mengikatnya dengan 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>
studgeek
sumber
2
Berdasarkan artikel / utas yang dia tautkan ke saya, dia benar-benar berarti "tidak default" dengan mengatakan tidak berdampingan. Jawaban saya menjadikan 4 default sehingga 3 tidak lagi terlihat. Fakta bahwa bash lama kebetulan masih memakan ruang disk sepertinya bukan masalah besar bagi saya.
studgeek
1
+1 oleh saya. Ya, OP tidak menginginkan ini, tetapi pertanyaannya adalah milik komunitas dan jika ini membantu orang lain, luar biasa. Mungkin tidak mendapatkan cek sebagai jawaban OP memilih, tetapi itu tidak membuatnya menjadi jawaban yang buruk.
bmike
3
Di High Sierra, sudo chpass -s /usr/local/bin/bashubah shell saya hanya untuk root / sudo . Untuk mengubah login reguler saya, saya harus menjalankan perintah tanpa sudo. Ini mungkin hal yang Active Directory; Saya tidak yakin.
Bradd Szonye
1
Alih-alih menggunakan #!/usr/local/bin/bashshebang, lihat menggunakan #!/usr/bin/env bash( penjelasan ). Ini akan menjalankan skrip dengan versi bash apa pun yang dapat dijangkau oleh lingkungan yang meluncurkan skrip, yaitu apa pun yang which bashkembali. Ini adalah solusi yang lebih portabel yang menggunakan jalur khusus. Kami tidak dapat mengharapkan pengguna lain untuk menginstal bash melalui homebrew.
Illya Moskvin
1
@IllyaMoskvin, saya awalnya menggunakan jalur tertentu karena saya ingin menunjukkan cara menggunakannya secara eksplisit. Saya telah memperbarui contoh untuk memiliki keduanya.
Studgeek
0

Anda dapat menginstal Bash versi lain tanpa homebrew

  • Pergi ke Bash GNU
  • Unduh versi yang Anda inginkan (di sini )
  • Dan ikuti langkah-langkahnya di sini: https://gist.github.com/samnang/1759336

    Unduh dan instal versi bash yang Anda inginkan Ganti XX (di bash-XX) dengan versi yang Anda inginkan misalnya 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
    

    Tambahkan shell baru ke daftar shell yang sah

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

    Ganti shell untuk pengguna

    chsh -s /usr/local/bin/bash

    Periksa Bash 4 dan / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Anda mungkin ingin menambahkan alias jika Anda ingin perintah bash untuk menggunakannya. Tempatkan di ~ / .bash_profile Anda

    alias bash="/usr/local/bin/bash"
Raposo
sumber
-1

Instalasi berdampingan dengan pembaruan ke shell Anda (melalui chsh atau GUI) akan gagal untuk skrip. Script sering digunakan env bash, yang kembali ke versi bash OS X. Jadi, yang Anda inginkan mungkin bukan pembaruan lengkap dari bash, tetapi pemasangan berdampingan yang selalu mengembalikan versi bash yang lebih baru (yaitu, bahkan ketika envdiminta).

Jadi, untuk menangani ini:

1) pasang bash via Homebrew, seperti yang sudah diposting oleh komentator lain

2) atur shell login Anda ke versi baru ini (melalui perintah GUI atau chsh seperti yang telah diposting orang lain)

3) setel /usr/local/bin(atau lintasan ke versi bash baru) di depan /binpada variabel $ PATH Anda, dengan menambahkan ini ke Anda ~/.bash_profile:export PATH=/usr/local/bin:$PATH

cwingrav
sumber
Ini akan memecah skrip yang mengharapkan bash versi 3 - yaitu skrip yang disediakan Apple - Anda harus menggunakan sde berdampingan
user151019
Poin yang adil. Sudah berjalan seperti ini untuk beberapa waktu sekarang dan tidak ada masalah. Mungkin Apple memberikan path lengkap dalam skrip-skripnya atau itu belum mencapai masalah. Untuk skrip level sistem apple, yaitu bukan dari shell, ia tidak pernah memanggilnya .bash_profile, jadi itu hanya akan berdampak pada sesuatu yang Anda jalankan langsung di terminal.
cwingrav
2
@ Mark Saya tidak bisa memikirkan contoh di mana v ≥4.x akan memecahkan skrip yang ditulis untuk v ≤3.x. Bisakah kamu?
Suara
-1

2019: Sesederhana di posting ini

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

lalu tab terminal baru, selamat menikmati!

Feuda
sumber
1
Siapa yang memilih saya sebagai jawaban tanpa penjelasan?
Feuda