Como substituir os utilitários do Mac OS X pelos utilitários principais do GNU?


181

Descobri que há algumas diferenças entre o comando utilitário que usei no mac OSX e no linux. Quero unir minha experiência.

Como eu poderia substituir todos os meus utilitários mac por GNU?



2
Aqui está um guia topbug.net/blog/2013/04/14/…
Dennis

16
Simpatizo com suas frustrações, mas acredito que, a longo prazo, causará maior frustração se elas forem substituídas - Depois de tentar fazer a mesma coisa, recomendo usar homebrewcomo mencionado abaixo e depois aprender a usar os utilitários com a g( gsed, greadlinketc) em vez de substituir os utilitários do sistema.
Cwd


3
Não concordo com @cwd, o uso --with-default-namesafeta apenas o usuário local. Pode ser um problema com os utilitários de terminal orientados a mac, mas se você usa o homebrew para tudo, também pode fingir que está usando o linux. Misturado com iterm2, está funcionando muito bem para mim, posso basicamente fingir que estou em casa com minhas caixas de linux.
Ray Foss

Respostas:


210

Isso adiciona links simbólicos para utilitários GNU com prefixo g para /usr/local/bin/:

brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep

Veja brew search gnupara outros pacotes. Se você deseja usar os comandos sem um prefixo AG, adicione, por exemplo, /usr/local/opt/coreutils/libexec/gnubinantes de outros diretórios no seu PATH.

$ brew info coreutils
coreutils: stable 8.21
http://www.gnu.org/software/coreutils
Depends on: xz
/usr/local/Cellar/coreutils/8.20 (208 files, 9.4M)
/usr/local/Cellar/coreutils/8.21 (210 files, 9.6M) *
https://github.com/mxcl/homebrew/commits/master/Library/Formula/coreutils.rb
==> Caveats
All commands have been installed with the prefix 'g'.

If you really need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:

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

Additionally, you can access their man pages with normal names if you add
the "gnuman" directory to your MANPATH from your bashrc as well:

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

6
FWIW, eu tenho uma Homebrew Formula que atua como um meta-pacote para todos aqueles ótimos utilitários GNU: veja shiny-and-gnu.rbem github.com/al-the-x/homebrew-mine
AL o

1
O primeiro PATH funciona, mas MANPATH falhou, por quê? É porque estou usando o OSX10.10? Eu ecoei $ MANPATH, e entendi /usr/local/opt/coreutils/libexec/gnuman:, parece que MANPATH original não foi incluído. Depois de comentar o confidente MANPATH no meu bashrc, não consegui nada ecoh $MANPATH. E, claro, se eu usar man pwd, recebi o manual do BSD. Como consertar isto?
Zen

2
Para findutils, você precisa adicionar o PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"que não está indicado na saída do console de instalação.
Sridhar Sarnobat

1
Além disso, para obter a página de manual correta findutils, adicione-a ao seu$MANPATH /usr/local/opt/findutils/share/man
Christian Long

1
@Zen: o caminho certo para iniciar MANPATHde forma a manter o valor do sistema padrão é: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". A chave está na construção ${var-default_value}.
dan

50

Além brew install coreutils, você também pode precisar instalar alguns outros pacotes, como gnu-sed, grep:

brew install findutils
brew install gnu-indent
brew install gnu-sed
brew install gnutls
brew install grep
brew install gnu-tar
brew install gawk

Observe que a --with-default-namesopção é removida desde janeiro de 2019, portanto, cada binário deve ser adicionado ao caminho para que seja usado sem o gprefixo.

Referência antiga (quando --with-default-namesdisponível): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/


Observe que brew install gawk(diferente de todos os outros) será substituído awk(por um link simbólico /usr/local/bin/awk). Se você quiser manter o original /usr/bin/awk, apenasrm /usr/local/bin/awk
wisbucky

17

Não tenho certeza se recomendaria substituí- los; no entanto, você pode instalá-los em um caminho diferente e utilizá-los dessa maneira. No geral, se você é proveniente do Linux e deseja acessar mais utilitários * genéricos * nix e um sistema semelhante ao apt, recomendo consultar o Macports: http://www.macports.org

Ele permite, por exemplo, usar o GCC "genérico" mais recente, em oposição a / além do GCC incluído na Apple, apenas como exemplo.


3
Por exemplo, tar e zip do Mac OS X sabem sobre metadados que as versões GNU não.
Lhf 22/10/12

1
Existem aplicativos fornecidos pela Apple, que são apenas GUIs para algumas ferramentas de linha de comando e, se você substituí-los, os aplicativos podem começar a se comportar de maneira estranha; portanto, adicione, não substitua.
Ɱark Ƭ

Direito; algo como o Macports os adiciona, não os substitui.
23412 Jonathan

Se você deseja usar os utilitários GNU por padrão com o MacPorts, pode adicioná /opt/local/libexec/gnubin-lo à frente da sua PATHvariável de ambiente.
markshep 26/09/16

8

Eu escrevi um script para fazer exatamente isso! O script pode ser visto aqui (ou abaixo). No entanto, nem sempre posso garantir que este post refletirá a versão mais recente do script vinculado anteriormente.

Após a execução do script, o Homebrew será instalado (se ainda não estiver), todos os utilitários GNU associados serão instalados (se ainda não estiverem), e a PATHvariável será criada a partir dos utilitários instalados.

#!/bin/bash

# Install Homebrew (if not already installed)
ruby -e "$(curl -fsSL "\
"https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Install required packages from Homebrew
brew tap homebrew/dupes
brew install coreutils binutils diffutils ed findutils gawk gnu-indent gnu-sed \
  gnu-tar gnu-which gnutls grep gzip screen watch wdiff wget bash gdb gpatch \
  m4 make nano file-formula git less openssh python rsync svn unzip vim \
  --default-names --with-default-names --with-gettext --override-system-vi \
  --override-system-vim --custom-system-icons

# Empty the .bash_path file that holds GNU paths
> ~/.bash_path

# Build PATH variable script in ~/.bash_path
for i in /usr/local/Cellar/*/*/bin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnubin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/share/man; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnuman; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done

# Check if .bash_path is being called from .bash_profile
PATCH=`grep "~/.bash_path" ~/.bash_profile`
if [ "$PATCH" == "" ]; then
  # Add Ubuntu-style PS1 to .bash_profile
  cat <<EOF > ~/.bash_profile
export PS1="\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]# "
EOF
  # Add .bash_path to .bash_profile
  echo "source ~/.bash_path" >> ~/.bash_profile
fi

1
Você simplesmente não ama os votos negativos sem comentários críticos? Obrigado pelo script.
Justin Força

@JustinForce Sem problemas! Obrigado pelo feedback.
Clay Freeman

2
-1. Este script faz muita mágica. Todo o .bash_path-mangling não é realmente necessário se você seguir as respostas de @ user495470 e @ xuhdev. E mudar o PS1 está completamente fora do escopo desta questão.
Greg Dubicki

1
@GregDubicki, infelizmente, o caminho bash "mangling" é necessário para alguns desses pacotes. Você pode verificar isso por si mesmo. Em relação à alteração do PS1: este script é para uso pessoal. Quem quiser revertê-lo pode fazê-lo com muita facilidade.
argila Freeman

5

Eu escrevi um script que transforma transparentemente a CLI do macOS em uma nova experiência da CLI do GNU / Linux,

  • instalando programas GNU ausentes
  • atualizando programas GNU desatualizados
  • substituindo programas BSD pré-instalados por sua implementação GNU preferida
  • instalar outros programas comuns entre distribuições populares do GNU / Linux

https://github.com/fabiomaia/linuxify

git clone https://github.com/fabiomaia/linuxify.git
cd linuxify/
./linuxify install

Também permite desfazer tudo com facilidade.

./linuxify uninstall

1
Tentando executar o primeiro comando ( git clone git@github.com.:fabiomaia/linuxify.git) Ele disse primeiro "A autenticidade do host 'github.com' não pode ser estabelecida etc.". Digitei yese pressionei Enter. Então ele disse: git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.O que há de errado?
izogfif 11/03

@izogfif Tente clonar com HTTPSgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia 11/03

1
Sim, isso funcionou. Atualize sua resposta (também remova esses dólares no início - eles são copiados quando você seleciona texto e copia e cola no console).
izogfif 12/03

@izogfif Obrigado pelas sugestões.
fabiomaia 12/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.