Come sostituire le utility di Mac OS X con le utility di base GNU?


181

Ho scoperto che ci sono alcune differenze tra il comando di utilità che ho usato su mac OSX e Linux. Voglio unire la mia esperienza.

Come posso sostituire tutte le mie utility mac con utility GNU?




16
Sono d'accordo con le tue frustrazioni, ma credo che, a lungo termine, causerà una maggiore frustrazione se vengono sostituite - Dopo aver cercato di fare la stessa cosa, ti consiglierei di usare homebrewcome indicato di seguito, e quindi solo imparare a usare le utility con una g( gsed, greadlink, ecc) invece di sostituire le utilità di sistema.
Cwd,


3
Non sono d'accordo con @cwd, l'utilizzo --with-default-namesriguarda solo l'utente locale. Potrebbe essere un problema con i programmi di utilità orientati ai mac, ma se usi homebrew per tutto, potresti anche fingere di usare Linux. Mescolato con iterm2, funziona benissimo per me, posso praticamente fingere di essere a casa con le mie scatole di Linux.
Ray Foss,

Risposte:


210

Questo aggiunge collegamenti simbolici per le utility GNU con prefisso g a /usr/local/bin/:

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

Vedi brew search gnuper altri pacchetti. Se si desidera utilizzare i comandi senza un prefisso AG aggiungere ad esempio /usr/local/opt/coreutils/libexec/gnubinprima di altre directory sul proprio 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, ho una formula Homebrew che funge da meta-pacchetto per tutti quei grandi programmi di utilità GNU: vedi shiny-and-gnu.rbin github.com/al-the-x/homebrew-mine
AL il X

1
Il primo PATH funziona, ma MANPATH ha fallito, perché? È perché sto usando OSX10.10? Ho fatto eco $ MANPATH, e ho ottenuto /usr/local/opt/coreutils/libexec/gnuman:, sembra che MANPATH originale non fosse incluso. Dopo aver commentato la configurazione MANPATH nel mio bashrc, non ho ottenuto nulla ecoh $MANPATH. E ovviamente, se lo uso man pwd, ho ricevuto il manuale BSD. Come risolvere questo?
Zen

2
Per findutils, è necessario aggiungere ciò PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"che non è indicato nell'output della console di installazione.
Sridhar Sarnobat,

1
Inoltre, per ottenere la pagina man giusta per findutils, aggiungi questo al tuo$MANPATH /usr/local/opt/findutils/share/man
Christian Long

1
@Zen: il modo giusto per iniziare MANPATHin modo da mantenere il valore di sistema di default è: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". La chiave è nel costrutto ${var-default_value}.
dan

50

Inoltre brew install coreutils, potrebbe anche essere necessario installare alcuni altri pacchetti, come ad esempio 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

Nota che l' --with-default-namesopzione è stata rimossa da gennaio 2019, quindi ogni binario deve essere aggiunto al percorso se devono essere usati senza il gprefisso.

Vecchio riferimento (quando --with-default-namesera disponibile): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/


Si noti che brew install gawk(a differenza di tutti gli altri) sostituirà awk(tramite un collegamento simbolico /usr/local/bin/awk). Se vuoi conservare l'originale /usr/bin/awk, solorm /usr/local/bin/awk
wisbucky

17

Non sono sicuro che consiglierei di sostituirli ; tuttavia, è possibile installarli in un percorso diverso e utilizzarli in questo modo. Nel complesso, se vieni da Linux e desideri accedere a più utility "generiche" * nix e un sistema simile a apt, ti consiglio di consultare Macports: http://www.macports.org

Consente, ad esempio, l'utilizzo dell'ultimo GCC "generico", al contrario di / in aggiunta al GCC incluso di Apple, solo come esempio.


3
Ad esempio, tar e zip da Mac OS X conoscono i metadati che le versioni GNU non conoscono.
LHF

1
Esistono app fornite da Apple, che sono solo GUI per alcuni strumenti da riga di comando e se le sostituisci, le app potrebbero iniziare a comportarsi in modo strano, quindi procedi con l'aggiunta, non con la sostituzione.
Ɱark Ƭ

Giusto; qualcosa come Macports li aggiunge, non li sostituisce.
Jonathan,

Se si desidera utilizzare le utility GNU per impostazione predefinita con MacPorts, è possibile aggiungere /opt/local/libexec/gnubinin primo piano la PATHvariabile di ambiente.
Marksp

8

Ho scritto una sceneggiatura per fare esattamente questo! Lo script può essere visualizzato qui (o sotto). Tuttavia, non posso sempre garantire che questo post rifletta l'ultima versione dello script collegata in precedenza.

Dopo aver eseguito lo script, Homebrew verrà installato (se non già), verranno installate tutte le utility GNU associate (se non già) e la PATHvariabile verrà creata dalle utility installate.

#!/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
Non ti piacciono i downvotes senza commenti critici? Grazie per la sceneggiatura.
Forza Justin,

@JustinForce Nessun problema! Grazie per il feedback.
Clay Freeman il

2
-1. Questo script fa troppa magia. Tutto il .bash_path-mangling non è veramente necessario se segui le risposte di @ user495470 e @ xuhdev. E cambiare PS1 è completamente fuori dallo scopo di questa domanda.
Greg Dubicki,

1
@GregDubicki sfortunatamente, per alcuni di questi pacchetti è necessario il percorso bash "mangling". Puoi verificarlo tu stesso. Per quanto riguarda il cambio di PS1: questo script è per uso personale. Chiunque desideri ripristinarlo può farlo molto facilmente.
Clay Freeman,

5

Ho scritto uno script che trasforma in modo trasparente la CLI macOS in una nuova esperienza della CLI GNU / Linux di

  • installazione di programmi GNU mancanti
  • aggiornamento di programmi GNU obsoleti
  • sostituendo i programmi BSD preinstallati con la loro implementazione GNU preferita
  • installare altri programmi comuni tra le più diffuse distribuzioni GNU / Linux

https://github.com/fabiomaia/linuxify

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

Ti consente anche di annullare facilmente tutto.

./linuxify uninstall

1
Tentativo di eseguire il primo comando ( git clone git@github.com.:fabiomaia/linuxify.git) In primo luogo è stato indicato che "L'autenticità dell'host" github.com "non può essere stabilita ecc.". Ho digitato yese premuto Invio. Poi ha detto 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.Cosa c'è che non va?
izogfif

@izogfif Prova invece a clonare con HTTPSgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia l'

1
Sì, ha funzionato. Per favore, aggiorna la tua risposta (inoltre, rimuovi quei dollari all'inizio: vengono copiati quando selezioni il testo e copia e incolla nella console).
izogfif

@izogfif Grazie per i suggerimenti.
fabiomaia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.