Jak zamienić narzędzia Mac OS X na podstawowe narzędzia GNU?


179

Odkryłem, że istnieją pewne różnice między poleceniem narzędzia, którego użyłem w systemie Mac OSX i Linux. Chcę połączyć moje doświadczenie.

Jak mogę zamienić wszystkie moje narzędzia Mac na narzędzia GNU?




16
Współczuję twoim frustracjom, ale wierzę, że w dłuższej perspektywie spowoduje to większą frustrację, jeśli zostaną one zastąpione - Po dążeniu do zrobienia tego samego, co zaleciłbym używać, homebrewjak wspomniano poniżej, a następnie po prostu nauczyć się korzystać z narzędzi z a g( gsed, greadlinkitp.) zamiast zastępowania narzędzi systemowych.
cwd


3
Nie zgadzam się z @cwd, używanie --with-default-nameswpływa tylko na lokalnego użytkownika. Może to być problem z narzędziami terminalowymi zorientowanymi na Mac, ale jeśli używasz homebrew do wszystkiego, możesz również udawać, że używasz Linuksa. Zmieszany z iterm2, działa świetnie dla mnie, mogę w zasadzie udawać, że jestem w domu ze swoimi urządzeniami z linuksem.
Ray Foss,

Odpowiedzi:


209

Dodaje to dowiązania symboliczne dla narzędzi GNU z prefiksem g do /usr/local/bin/:

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

Zobacz brew search gnuinne pakiety. Jeśli chcesz używać poleceń bez przedrostka ag, dodaj na przykład /usr/local/opt/coreutils/libexec/gnubinprzed innymi katalogami na swoim 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 mam Homebrew formuła, która działa jako meta-pakiet dla wszystkich tych wielkich GNU utils: patrz shiny-and-gnu.rbw github.com/al-the-x/homebrew-mine
AL X

1
Pierwsza ŚCIEŻKA działa, ale MANPATH zawiodła, dlaczego? Czy to dlatego, że używam OSX10.10? Powtórzyłem echo $ MANPATH i dostałem /usr/local/opt/coreutils/libexec/gnuman:, wydaje się, że oryginalna MANPATH nie została uwzględniona. Po skomentowaniu conf MANPATH w moim bashrc, nic nie dostałem ecoh $MANPATH. I oczywiście, jeśli użyję man pwd, mam instrukcję BSD. Jak to naprawić?
Zen.

2
Dla findutilstrzeba dodawać PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH", która nie jest zawarta w wyjścia konsoli instalacji.
Sridhar Sarnobat

1
Ponadto, aby uzyskać odpowiednią stronę podręcznika findutils, dodaj ją do$MANPATH /usr/local/opt/findutils/share/man
Christian Long

1
@Zen: właściwa droga do zainicjowania MANPATHtak aby utrzymać wartość domyślną systemu jest: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". Klucz jest w konstrukcji ${var-default_value}.
dan

49

Poza tym brew install coreutils, można także zainstalować jakieś inne pakiety, takie jak 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

Pamiętaj, że --with-default-namesopcja jest usuwana od stycznia 2019 r., Więc każdy plik binarny musi zostać dodany do ścieżki, jeśli ma być używany bez gprefiksu.

Stare odniesienie (gdy --with-default-namesbyło dostępne): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/


Zauważ, że brew install gawk(w przeciwieństwie do wszystkich innych) zastąpi awk(poprzez dowiązanie symboliczne /usr/local/bin/awk). Jeśli chcesz zachować oryginalny /usr/bin/awk, po prosturm /usr/local/bin/awk
wisbucky

16

Nie jestem pewien, czy zaleciłbym ich wymianę ; Możesz jednak zainstalować je na innej ścieżce i wykorzystać w ten sposób. Ogólnie, jeśli pochodzisz z Linuksa i chciałbyś uzyskać dostęp do bardziej „ogólnych” narzędzi * nix oraz systemu podobnego do apt, to polecam zajrzeć do Macports: http://www.macports.org

Pozwala to na przykład na użycie najnowszego „ogólnego” GCC, w przeciwieństwie do / oprócz dołączonego GCC Apple, na przykład.


3
Na przykład tar i zip z Mac OS X wiedzą o metadanych, których nie mają wersje GNU.
lhf 22.10.12

1
Istnieją aplikacje dostarczane przez Apple, które są tylko GUI dla niektórych narzędzi wiersza poleceń, a jeśli je zastąpisz, aplikacje mogą zacząć dziwnie się zachowywać, więc idź z dodawaniem, a nie zastępowaniem.
Ɱark Ƭ

Dobrze; coś takiego jak Macports dodaje je, nie zastępuje.
Jonathan

Jeśli chcesz domyślnie korzystać z narzędzi GNU z MacPorts, możesz dodać /opt/local/libexec/gnubinz przodu PATHzmiennej środowiskowej.
markshep

8

Napisałem skrypt, aby dokładnie to zrobić! Skrypt można obejrzeć tutaj (lub poniżej). Jednak nie zawsze mogę zagwarantować, że ten post będzie odzwierciedlał najnowszą wersję wcześniej połączonego skryptu.

Po uruchomieniu skryptu Homebrew zostanie zainstalowany (jeśli jeszcze nie), wszystkie powiązane narzędzia GNU zostaną zainstalowane (jeśli jeszcze nie), a PATHzmienna zostanie zbudowana z zainstalowanych narzędzi.

#!/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
Czy nie uwielbiasz głosów negatywnych bez krytycznych komentarzy? Dziękuję za scenariusz.
Justin Force

@JustinForce Nie ma problemu! Dziękuję za zwrotną informację.
Clay Freeman,

2
-1. Te skrypty powodują zbyt wiele magii. Wszystkie .bash_path-mangling nie jest tak naprawdę konieczne, jeśli postępujesz zgodnie z odpowiedziami @ user495470 i @ xuhdev. A zmiana PS1 jest całkowicie poza zakresem tego pytania.
Greg Dubicki

1
@GregDubicki niestety, ścieżka bash „mangling” jest wymagana dla niektórych z tych pakietów. Możesz to sprawdzić samodzielnie. W odniesieniu do zmiany PS1: ten skrypt jest do użytku osobistego. Każdy, kto chce to cofnąć, może to zrobić bardzo łatwo.
Clay Freeman

5

Napisałem skrypt, który transparentnie przekształca interfejs macOS CLI w nowy interfejs GNU / Linux CLI

  • instalowanie brakujących programów GNU
  • aktualizowanie przestarzałych programów GNU
  • zastępowanie preinstalowanych programów BSD preferowaną implementacją GNU
  • instalowanie innych programów popularnych wśród popularnych dystrybucji GNU / Linux

https://github.com/fabiomaia/linuxify

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

Pozwala również łatwo cofnąć wszystko.

./linuxify uninstall

1
Próba uruchomienia pierwszego polecenia ( git clone git@github.com.:fabiomaia/linuxify.git) Najpierw napisano: „Nie można ustalić autentyczności hosta„ github.com ”itp.”. Wpisałem yesi nacisnąłem Enter. Potem powiedział 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.Co się stało?
izogfif

@izogfif Zamiast tego spróbuj klonować za pomocą HTTPSgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia

1
Tak, zadziałało. Zaktualizuj swoją odpowiedź (usuń te dolary na początku - są one kopiowane po zaznaczeniu tekstu i skopiuj-wklej do konsoli).
izogfif

@izogfif Dziękujemy za sugestie.
fabiomaia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.