Atualizar o bash para a versão 4.0 no OSX

81

É possível atualizar o bash para a versão 4.0 no OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Este artigo e esta discussão se referem à mesma pergunta, mas eles instalam um novo shell lado a lado com o antigo. Existe uma maneira de atualizar diretamente o antigo shell bash?

sluijs
fonte
3
Não há necessidade de fazer isso. De fato, é sempre uma boa ideia manter a original. Duas ou mais versões de festa pode ser instalado ao mesmo tempo, e você pode definir qualquer um que você gostaria de ser o padrão
lupincho
Essencialmente, a Atualização de software da Apple seria responsável por alterar a versão do BASH no sistema, como aconteceu com a atualização para o BASH para Shellshock. Portanto, a menos que a Apple forneça uma atualização, não há maneira direta de atualizar para a versão mais recente do GNU BASH que foi instalada como parte do OS X. Uma maneira indireta seria baixá-lo você mesmo, por um meio ou outro, e instalá-lo e Em seguida, defina-o como seu shell padrão. Se você optar por remover a versão enviada ou a versão atualizada da Apple, isso é com você.
user3439894

Respostas:

36

A Apple não atualizará o Bash, porque a versão mais recente está licenciada sob a GPLv3, que a Apple não pode usar. Eles atualizaram a maioria de suas outras conchas. O ZSH, por exemplo, é principalmente atualizado.

Referências:

Após algumas pesquisas, esse parece ser o principal problema:

Quando as pessoas distribuem Produtos de Usuário que incluem software sob a GPLv3, a seção 6 exige que eles forneçam as informações necessárias para modificar esse software. Produtos para usuários é um termo especialmente definido na licença; exemplos de produtos para usuários incluem tocadores de música portáteis, gravadores de vídeo digitais e sistemas de segurança doméstica.

Isso exigiria que o software de código fechado, de outra forma, tivesse suas partes da GPL modificadas pelo público, o que obviamente seria um problema para a Apple.

William T Froggard
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
bmike
5
Esta explicação não faz sentido. O envio de um binário GPL (v3 ou não) não significa que o restante do sistema operacional precisaria ser liberado. O restante do sistema operacional não está vinculado a bash. A cláusula "Tivoization" pode explicar por bashque não pode ser atualizada, digamos, em uma Apple TV, mas não em um Mac de mesa. Além disso, "partes da GPL" já precisariam ser modificadas pelo público; v3 não mudaria isso. Eu acreditaria que a cláusula de patentes da GPL v3 seria suficiente para impedir a Apple de tocar no código da GPL v3.
jamesdlin
Por que isso seria um problema para a Apple? O Bash já é de código aberto (todas as versões ≥1,14 estão disponíveis no GNU @ ftp.gnu.org/gnu/bash e a versão incluída no macOS (atualmente v3.2) está disponível no Apple @ opensource.apple.com/source/bash ), mas pode ser modificado independentemente.
voices
@ tjt263 Trata-se das diferenças entre a GPLv3 e a GPLv2, que a versão que a Apple usa, ainda está licenciada.
William T Froggard
3
Certo, o Bash3.2 é licenciado sob a GPLv2. O Bash4.x é licenciado sob a GPLv3. E daí? Você disse: "A Apple não atualizará o Bash, porque a versão mais recente está licenciada sob a GPLv3, que a Apple não pode usar ". Por que eles não podem? "Isso exigiria que o software de código fechado, de outra forma, tivesse suas partes da GPL modificadas pelo público , o que obviamente seria um problema para a Apple ". Por que isso é um problema? Eles já fazem isso. Já é modificável pelo público. Todo o software é. Especialmente quando é FOSS e eles estão distribuindo o código-fonte em seu site para quem quiser.
vozes
62

É possível atualizar o bash para a versão 4.0 no OSX Yosemite? Sim.

  1. Faça o download / instale o homebrew http://brew.sh/ executando este comando no terminal.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Saia e reabra o seu terminal. então digite

    brew install bash
  3. Mude o shell padrão através do terminal gui com o caminho literal do seu novo bash (EDIT: ainda não encontrei uma maneira CLI que funcione)

insira a descrição da imagem aqui

É possível atualizar o bash para a versão 4.0 do Apple fornecida no OSX Yosemite?

EDIT: Não. Não da maneira que o op está perguntando. Por exemplo, atualize a instalação atual, substituindo-se. Observou-se em outras respostas que a Apple não atualizou o bash devido a problemas de licenciamento. No entanto, baixar uma versão atualizada e separada do bash e usá-la como seu shell padrão é a solução canônica para a maioria dos intérpretes. Veja o python, por exemplo. Você não atualiza de 2,7 para 3,5, baixa uma versão separada e altera seu padrão.

user136952
fonte
12
Você pode definir o padrão através do CLI com: sudo chpass -s /usr/local/bin/bash. Nota: É melhor apontar para o link simbólico, para /usr/local/bin/que o Brew possa lidar com atualizações sem precisar mudar o ambiente a cada vez.
precisa saber é o seguinte
3
quais são os riscos de usar um shell que não seja da Apple?
Bjorks número um fã
5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'então chsh -s /usr/local/bin/bashdefinirá o shell padrão para o terminal
Abhijit Sarkar
51

Como @William disse em sua resposta, a Apple não fornece o bash 4 devido a restrições da GPL. No entanto, você pode instalar o bash 4+ e também pode torná-lo seu shell padrão (incluindo o Terminal e o iTerm2 ), fazendo o seguinte.

Instale o Bash 4 via Homebrew

Primeiro instale a versão mais recente do bash. Existem várias maneiras de fazer isso, eu prefiro o Homebrew.

  • Instale o Homebrew conforme descrito em http://brew.sh .
  • Instale o bash usando brew install bash.

O Bash 4 está agora disponível no seu PATH (assumindo que o bin Homebrew está no seu caminho). No entanto, ainda não é seu shell padrão. Você pode descobrir onde ele está localizado executando which bash. No meu caso é às /usr/local/bin/bash.

Usando o Bash 4

Como está no PATH, é possível iniciar uma sessão do Bash 4 apenas bashou pode ser usada em scripts usando um Shebang .

Por exemplo, isso usará uma instância específica do bash.

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

Isso usará o primeiro bash no PATH.

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

Você também pode definir o caminho do bash para perfis específicos no Terminal / iTerm2 usando as etapas descritas na resposta de @ user136952.

Tornando o Bash 4 o padrão

Como mencionado acima, depois de instalar o Bash 4 ainda não é o shell padrão. Para tornar o bash o padrão, você precisa executar mais duas etapas.

Primeiro, adicione o caminho do Bash 4 ao seu /etc/shellsarquivo para que ele seja um shell de login permitido. Conforme descrito em / etc / shells , esse arquivo possui a lista de shells de login válidos. Depois de adicionar o novo caminho do bash, minha /etc/shellsaparência é a seguinte:

# 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

Em seguida, usamos o chsh para torná-lo seu shell padrão. Portanto, qualquer sessão desse usuário usará esse shell. Você pode ler mais sobre isso em Alterar o shell no Mac OS X Terminal , mas o comando real é muito direto.

chsh -s /usr/local/bin/bash

Agora, o novo bash é o nosso shell de login padrão. Se você abrir o Terminal ou o iTerm2 e executar, bash --versiondeverá ver a nova versão. Observe a "Licença GPLv3 +" e é por isso que a Apple não o inclui no 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
fonte
2
Com base no artigo / tópico ao qual ele vinculou, acho que ele realmente quis dizer "não padrão" dizendo não lado a lado. Minha resposta faz com que 4 seja o padrão, para que 3 não seja mais visto. O fato de o antigo bash ainda estar ocupando espaço em disco não parece ser um grande problema para mim.
studgeek
11
+1 por mim. Sim, o OP não quer isso, mas a pergunta pertence à comunidade e, se isso ajuda outras pessoas, incrível. Pode não ser verificado como a resposta que o OP seleciona, mas isso não a torna uma resposta ruim.
bmike
3
No High Sierra, sudo chpass -s /usr/local/bin/bashaltera meu shell apenas para root / sudo . Para alterar para o meu login normal, devo executar o comando sem sudo. Isso pode ser uma coisa do Active Directory; Não tenho certeza.
Bradd Szonye
11
Em vez de usar o #!/usr/local/bin/bashshebang, procure usar #!/usr/bin/env bash( explicação ). Isso executará o script com qualquer versão do bash acessível pelo ambiente que está iniciando o script, ou seja, o que for which bashretornado. É uma solução mais portátil que usando caminhos específicos. Não podemos esperar que outros usuários instalem o bash através do homebrew.
Illya Moskvin
11
@IllyaMoskvin, originalmente usei um caminho específico porque queria mostrar como usá-lo explicitamente. Atualizei os exemplos para ter os dois.
studgeek 5/01
0

Você pode instalar outra versão do Bash sem homebrew

  • Vá para GNU Bash
  • Baixe a versão que você deseja ( aqui )
  • E siga as etapas aqui: https://gist.github.com/samnang/1759336

    Faça o download e instale a versão do bash desejada Substitua XX (no bash-XX) pela versão desejada, por exemplo, 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
    

    Adicione o novo shell à lista de shells legítimos

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

    Mude o shell para o usuário

    chsh -s /usr/local/bin/bash

    Verifique o Bash 4 e / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Você pode adicionar um alias se desejar que o comando bash o utilize. Coloque no seu ~ / .bash_profile

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

A instalação lado a lado com uma atualização para o seu shell (via chsh ou GUI) falhará nos scripts. Os scripts costumam usar env bash, o que é revertido para a versão do OS X bash. Portanto, o que você deseja pode não ser a atualização completa do bash, mas uma instalação lado a lado que sempre retorna a versão mais recente do bash (ou seja, mesmo quando envé invocada).

Então, para lidar com isso:

1) instale o bash via Homebrew, como os outros comentaristas publicaram

2) defina seu shell de login para esta nova versão (por meio do comando GUI ou chsh, como outros postaram)

3) defina /usr/local/bin(ou o caminho para a nova versão do bash) à frente da /binsua variável $ PATH, adicionando isto ao seu ~/.bash_profile:export PATH=/usr/local/bin:$PATH

cwingrav
fonte
Isso vai quebrar scripts que esperam o bash versão 3 - ou seja, a Apple forneceu roteiros - Você precisa usar sde a lado
user151019
Um ponto justo. Está em execução assim há algum tempo e sem problemas. Talvez a Apple forneça o caminho completo em seus scripts ou simplesmente não tenha encontrado um problema. Para scripts no nível do sistema apple, ou seja, não a partir de um shell, ele nunca chama .bash_profileassim, portanto, afetaria apenas algo que você executa diretamente em um terminal.
cwingrav
2
@ Mark Não consigo pensar em uma instância em que v ≥4.x quebraria um script escrito para v ≤3.x. Você pode?
voices
-1

2019: Tão simples quanto neste post

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

depois guia um novo terminal, divirta-se!

Feuda
fonte
11
Quem votou na minha resposta sem uma explicação?
Feuda 17/10