Substitua os comandos do shell do OS X pelas versões linux?

32

Os comandos disponíveis por padrão no Terminal no OS X, não parecem se comportar como suas versões do Linux. Como posso substituir todos eles pelos comandos reais do GNU linux?

Por exemplo, sed -i requer um argumento "" irritantemente adicional. Além disso, ele funciona apenas com arquivos de texto. Isso é inútil.

Único
fonte
1
Umm ... sed é um "editor de texto", também pode modificar arquivos binários. O que mais você gostaria que fizesse? Por favor, explique o que exatamente você precisa. Não consigo entender o seu problema, você poderia dar mais alguns exemplos?
terdon 18/09/12
3
Na verdade, sed é um editor de stream . Não é pedante, mas na verdade não é para modificar arquivos, a menos que esses arquivos sejam fluxos. É exatamente por isso que a -ibandeira não é padrão . edé para editar arquivos.
Kojiro

Respostas:

43

No caso geral, você não pode (ou não deve ) substituir os comandos padrão. O motivo é que muitos scripts de administração do sistema e pacotes de terceiros provavelmente dependem desses comandos para se comportarem da maneira que eles fazem de imediato no OS X.

Portanto, se você apenas apagar os comandos do sistema e substituí-los por equivalentes GNU que possuem comportamento incompatível ou argumentos de linha de comando, provavelmente isso quebrará alguma coisa. Especialmente se você usar algum software que foi "portado" para o Mac OS X após ser originalmente projetado para ser executado no Linux ou BSD, pois esses tipos de programas têm maior probabilidade de depender de scripts de shell e comandos do sistema, em vez de chamar APIs do OS X.

O que você pode fazer é instalar um ambiente que instale os utilitários GNU em outro diretório sem substituir os padrões e, em seguida, ajuste sua PATHvariável de ambiente para dar prioridade aos comandos encontrados no diretório GNU antes mesmo de pesquisar nos diretórios do sistema. Você pode conectar isso para que ele apenas configure seu PATH dessa maneira se estiver iniciando um shell interativo; você pode pesquisar no Google como fazer isso bashou fazer outra pergunta no SU (ou procurá-lo, pois provavelmente já foi perguntado antes) se quiser fazer isso.

Um exemplo desse ambiente é o Homebrew, que por exemplo possui o GNU sedentre outras coisas. Depois de instalar o Homebrew, você pode digitar

brew install coreutils

e instale o GNU Coreutils . Estes irão fornecer-lhe sed, date, printf, wce muitas outras ferramentas que vêm com o GNU / Linux, mas não OS X. No entanto, de modo a não "substituição" binários OS padrão X, eles serão prefixados com gpor padrão. Então, depois de instalar o Coreutils, se você quiser usar o GNU sed, digite

gsed

Se isso é muito complicado de digitar toda vez, você pode adicionar um diretório "gnubin" ao seu PATH e apenas chamar o GNU sed com sed. Você precisará adicionar o seguinte ao seu ~/.bash_profile:

PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"

Obviamente, se você precisar de um ambiente Linux, de sopa a nozes (kernel, X11, compatibilidade com syscall, etc.), precisará executar o Linux em uma máquina virtual, como o VirtualBox . Essa é uma aposta segura se você precisar executar software ou scripts projetados para serem executados no Linux.

O Homebrew só oferece compatibilidade com certas classes de programas que não exigem comportamento específico do Linux. Por exemplo, inotifyestá disponível apenas no Linux. drm(o Direct Rendering Manager) está disponível apenas no Linux. Existem outras chamadas de sistema de nível inferior disponíveis apenas no Linux e para as quais não existe equivalente no OS X, portanto, a portabilidade de determinados programas do Linux para o OS X pode ser impraticável ou impossível sem alterações significativas no código.

allquixotic
fonte
Sempre há o Boot Camp . :)
kojiro
13
Por qualquer motivo brew install coreutilsque não inclua sed. Você pode fazer brew install gnu-sedisso, porém, instala gsede não sed, mesmo se você atualizar o seu $PATH. Eu criei um link simbólico para ocultar os Macs sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedno entanto, você ainda precisa fazer man gsedpara ver a página de manual correta.
dimo414
6
brew install gnu-sed --default-namesirá instalá-lo comosed
ivotron
1
Em vez de --default-names, você pode instalar com os comandos prefixados g e, em seguida, instalar oh-my-zsh (altamente recomendado) e ativar o plugin gnu-utils.
precisa saber é o seguinte
3

Você pode usar um prefixo do Gentoo que suporte o OS X, pode fazer isso inicializando-o e adicionando os caminhos relevantes no diretório do prefixo ao seu PATH. Pode ser que isso já faça isso por você. Depois de fazer isso, você pode usar os comandos padrão do Gentoo para instalar pacotes.

emerge coreutils você obterá os utilitários GNU padrão, por exemplo.

Por favor note que o Gentoo compila por padrão, você pode querer configurar um host binário . Este é apenas usando um dos URLs no segundo semestre do mesmo artigo, e colocá-lo em PORTAGE_BINHOST="... your url here ..."em ./etc/make.confem seu prefixo.

Tamara Wijsman
fonte
1

Como acompanhamento da publicação de @ allquixotic, aqui estão as instruções oficiais para brew install coreutils

Todos os comandos foram instalados com o prefixo 'g'.

Se você realmente precisa usar esses comandos com o nome normal, pode adicionar um diretório "gnubin" ao PATH a partir do seu bashrc como

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Além disso, você pode acessar as páginas de manual com nomes normais, o diretório "gnuman" para o MANPATH a partir do bashrc.

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
user72923
fonte
0

Com relação a sedvocê, você pode baixar um binário pré-compilado do Rudixprojeto. Para mais Rudixpacotes, veja aqui e aqui .

kerny
fonte