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é
- por exemplo.
/usr/local/bin/gmv
→../Cellar/coreutils/$version/bin/gmv
Mensagens relacionadas