Como posso configurar um ambiente bash separado com apenas utilitários GNU no OS X?

3

Nos últimos 5 anos, usei o Linux como meu sistema operacional diário para realizar computação científica. Meu trabalho recentemente me deu um Mac que serei o principal usuário nos próximos meses. Eu continuo correndo em conflitos entre o ambiente bash do Free-BSD no Mac e o ambiente GNU com o qual estou acostumado, ambos com scripts bash que eu configurei e enquanto tento executar comandos bash ( coreutils , findutils , etc) . Eu não quero mudar completamente para os utilitários Free-BSD como todos os meus outros computadores, bem como nossos HPC's usam linux com os utilitários GNU. Eu quero evitar ter que manter dois conjuntos de scripts bash e também ter que lembrar as nuances dos diferentes sinalizadores e funcionalidades entre os dois sistemas. Eu também não quero quebrar qualquer um dos utilitários de gui do Mac, etc, que outros usuários usarão (nos próximos meses ou quando for dado a outra pessoa). Além disso, as respostas a esta questão relacionada avisam sobre a substituição completa dos utilitários Mac Free-BSD pelos utilitários GNU.

É possível instalar / configurar um ambiente de bash separado para usar apenas os utilitários GNU enquanto deixa o sistema Free-BSD no lugar? Eu espero que a opção mais promissora seja configurar meu $PATH variável para apontar para um diretório contendo os executáveis GNU (com seus nomes padrão) enquanto ignora os do Free-BSD. Como eu poderia aplicar isso aos meus scripts bash multi-plataforma? Existem opções alternativas que valem a pena considerar?

    
por Steven C. Howell 17.07.2015 / 17:49

2 respostas

6

Primeiro, trata-se de muito mais do que apenas coreutils . O equivalente em BSD a GNU findutils também é bem diferente , praticamente todos os comandos relacionados a dynamic linkage é diferente, etc.

E, além disso, você precisa lidar com as diferenças de versão: o OS X ainda traz muitos softwares antigos para permanecer na GPL2 em vez de na GPL3, como o Bash 3.x em vez do Bash 4.x. Os autotools também costumam estar desatualizados em relação às distribuições do Linux.

A resposta para a parte principal da sua pergunta é: "Claro, por que não?" Você pode usar o Homebrew para instalar todas essas ferramentas alternativas do GNU, depois colocar $(brew --prefix coreutils)/libexec/gnubin e /usr/local/bin primeiro no seu PATH para ter certeza eles são encontrados primeiro:

export PATH="$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"

Se por algum motivo brew instalar um pacote em outro local, inclua também esse valor na variável PATH .

Se você preferir apenas substituir alguns pacotes, o problema é lidar com todas as mudanças de nome. Sempre que brew instalar um programa que já tenha uma implementação no sistema operacional central, como ao instalar o GNU coreutils , ele nomeará sua versão de forma diferente para que você possa executá-la, dependendo de sua necessidade no momento. Em vez de renomear todos esses links simbólicos¹, recomendo que você corrija tudo isso com uma camada de indireção:

$ mkdir ~/linux
$ cd ~/linux
$ ln -s /usr/local/bin/gmv mv
...etc for all the other tools you want to rename to cover OS versions
$ export PATH=$HOME/linux:$PATH
...try it out...

Quando estiver satisfeito com seu novo ambiente, você poderá colocar export PATH=$HOME/linux:$PATH em seu ~/.bash_profile .

Isso cuida do uso interativo, seja com substituição em massa ou substituição de aplicativo único.

Infelizmente, isso não resolve completamente o problema do shell script, porque às vezes os shell scripts obtêm seu próprio ambiente, como quando são iniciados a partir de cron . Nesse caso, você poderia modificar o PATH na parte superior de cada script de shell de plataforma cruzada:

#!/bin/bash
export PATH="$HOME/linux:$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"

Você não precisa torná-lo condicional, pois está apenas oferecendo ao shell um outro local para procurar por programas.

Notas de rodapé

  1. por exemplo. /usr/local/bin/gmv../Cellar/coreutils/$version/bin/gmv

Mensagens relacionadas

  1. Como substituir os utilitários do Mac OS X pelos utilitários principais do GNU?
  2. Instalar e usar as ferramentas de linha de comando GNU no Mac OS X
por 17.07.2015 / 18:34
-1

Colocar esta resposta aqui como algo que você tentaria se rodar o GNU fosse impossível rodar nativamente ao lado do freebsd sem usar a caixa VM ou o boot de duelo.

Como afirmado, o homebrew não pode instalar todos os coreutils GNU e me corrigir se eu estiver errado, mas você também quer poder ter todos os seus arquivos em um lugar (um mechine)

Se você tem um computador secundário conectado à Internet (talvez um pi framboesa?), você pode SSH no linux mechine de você mac ou Se você quiser usar o X-environent, você pode usar o x11vnc para usar o linux computador no seu mac.

Tenha em mente que, se você usar o SSH, só poderá acessar o shell de login.

Como criar um servidor e cliente SSH

Primeiro, desmarque se o servidor openssh está rodando no seu linux mechine

$ service ssh status

Do serviço está em execução, você receberá uma saída como essa. %código% Se o serviço não estiver sendo executado, primeiro verifique se o openssh está instalado

sudo apt-get install openssh

inicie o serviço

sudo service ssh start

E tudo feito! (a menos que você queira criar chaves)

Agora você pode entrar no seu Linux mechine através do SSH como tal

ssh <USERNAME_ON_LINUX_MECHINE>@<LINUX_HOST_NAME>

O nome do host linux é principalmente o endereço IP externo do mechine.

(Claro, você precisa do openssh instalado no seu mac também)

Aqui está um tutorial completo sobre tunelamento SSH

link

Como usar um servidor e cliente x11vnc

Eu uso o vnc para ser uma forma melhor de SSH (minha opinião pessoal) O VNC é mais fácil de instalar do que o SSH

Aqui está um link para arch-wiki para configurar o vnc link

  • instalando x11vnc

    ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2015-07-17 16:51:08 NPT; 5h 21min ago Process: 1669 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS) Main PID: 615 (sshd) CGroup: /system.slice/ssh.service └─615 /usr/sbin/sshd -D

  • Crie uma senha para seu usuário:

    sudo apt-get install x11vnc

  • Se você tem a configuração ssh, pode usá-la para iniciar o x11vnc, supondo que esteja já está logado, mas lembre-se de dizer para usar o seu arquivo de senha:

    x11vnc -storepasswd

Supondo que você esteja usando lightdm para o login, você pode corrigir este problema. Você pode iniciar o x11vnc com o comando:

sudo x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw

Espero que isso ajude: D

    
por 17.07.2015 / 18:42

Tags