Wie ersetze ich Mac OS X-Dienstprogramme durch GNU-Kerndienstprogramme?

181

Ich habe festgestellt, dass es einige Unterschiede zwischen dem Dienstprogrammbefehl, den ich unter Mac OSX und Linux verwendet habe, gibt. Ich möchte meine Erfahrung vereint machen.

Wie könnte ich alle meine Mac-Dienstprogramme durch GNU-Dienstprogramme ersetzen?

Steveyang
quelle
2
Hier ist eine Anleitung topbug.net/blog/2013/04/14/…
Dennis
16
Ich sympathisiere mit Ihrer Frustrationen , aber ich glaube , dass auf lange Sicht, wird es mehr Frustration führen , wenn sie ersetzt - Nach versuchen , die gleiche Sache zu tun würde ich empfehlen , homebrewwie unten erwähnt, und dann nur zu lernen , die Dienstprogramme zu verwenden , um mit a g( gsed, greadlink, usw.) anstelle der Systemprogramme zu ersetzen.
KWD
Weitere Informationen finden
Dan Pritts,
3
Ich bin mit @cwd nicht einverstanden, die Verwendung --with-default-nameswirkt sich nur auf den lokalen Benutzer aus. Es könnte ein Problem mit Mac-orientierten Terminal-Dienstprogrammen sein, aber wenn Sie Homebrew für alles verwenden, könnten Sie auch so tun, als würden Sie Linux verwenden. Gemischt mit iterm2 funktioniert es großartig für mich. Ich kann im Grunde so tun, als wäre ich mit meinen Linux-Boxen zuhause.
Ray Foss

Antworten:

210

Dies fügt Symlinks für GNU-Dienstprogramme mit dem Präfix g hinzu zu /usr/local/bin/:

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

Siehe brew search gnufür andere Pakete. Wenn Sie die Befehle ohne ein Präfix verwenden möchten, fügen Sie sie beispielsweise /usr/local/opt/coreutils/libexec/gnubinvor anderen Verzeichnissen auf Ihrem Computer hinzu 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"
Lri
quelle
6
FWIW, ich habe eine Homebrew-Formel, die als Metapaket für all diese großartigen GNU-Utils fungiert: siehe shiny-and-gnu.rbunter github.com/al-the-x/homebrew-mine
AL
1
Der erste PATH funktioniert, aber MANPATH ist fehlgeschlagen. Warum? Liegt es daran, dass ich OSX10.10 verwende? Ich habe $ MANPATH wiederholt und es /usr/local/opt/coreutils/libexec/gnuman:scheint, als wäre das Original-MANPATH nicht enthalten. Nachdem ich die MANPATH-Konf in meinem Baschromat auskommentiert hatte, kam ich nicht weiter ecoh $MANPATH. Und natürlich, wenn ich es benutze man pwd, habe ich das BSD-Handbuch. Wie kann man das beheben?
Zen
2
Für findutilsmüssen Sie hinzufügen, PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"was nicht in der Ausgabe der Installationskonsole angegeben ist.
Sridhar Sarnobat
1
Um die richtige Manpage für zu erhalten findutils, fügen Sie diese zusätzlich zu Ihrer$MANPATH /usr/local/opt/findutils/share/man
Christian Long
1
@Zen: der richtige Weg zu initiieren , MANPATHum den Standard - Systemwert zu halten ist: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". Der Schlüssel liegt im Konstrukt ${var-default_value}.
Dan
50

Außerdem brew install coreutilsmüssen Sie möglicherweise auch einige andere Pakete installieren, z. B 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

Beachten Sie, dass die --with-default-namesOption entfernt seit Januar 2019, so dass jeder binären muss den Pfad hinzugefügt werden , wenn sie ohne denen verwendet werden sollen gPräfix.

Alte Referenz (wenn --with-default-namesverfügbar): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

xuhdev
quelle
Beachten Sie, dass brew install gawk(im Gegensatz zu allen anderen) ersetzt wird awk(über einen symbolischen Link /usr/local/bin/awk). Wenn Sie möchten , um das Original zu halten /usr/bin/awk, nurrm /usr/local/bin/awk
wisbucky
17

Ich bin mir nicht sicher, ob ich empfehlen würde , sie zu ersetzen . Sie können sie jedoch in einem anderen Pfad installieren und auf diese Weise verwenden. Alles in allem würde ich Macports empfehlen: http://www.macports.org

Es ermöglicht zum Beispiel die Verwendung des neuesten "generischen" GCC, im Gegensatz zu / zusätzlich zu dem im Lieferumfang von Apple enthaltenen GCC, nur als Beispiel.

Jonathan
quelle
3
Beispielsweise kennen tar und zip von Mac OS X Metadaten, die die GNU-Versionen nicht kennen.
lhf 22.10.12
1
Es gibt von Apple bereitgestellte Apps, bei denen es sich nur um GUIs für einige Befehlszeilentools handelt. Wenn Sie sie ersetzen, verhalten sich die Apps möglicherweise merkwürdig. Fügen Sie sie also hinzu, und ersetzen Sie sie nicht.
Ɱark Ƭ
Richtig; So etwas wie Macports fügt sie hinzu und ersetzt sie nicht.
Jonathan
Wenn Sie die GNU-Dienstprogramme standardmäßig mit MacPorts verwenden möchten, können Sie /opt/local/libexec/gnubinsie der PATHUmgebungsvariablen voranstellen.
Markshep
8

Ich habe ein Skript geschrieben, um genau das zu tun! Das Skript kann hier (oder unten) eingesehen werden . Ich kann jedoch nicht immer garantieren, dass dieser Beitrag die neueste Version des zuvor verlinkten Skripts widerspiegelt.

Beim Ausführen des Skripts wird Homebrew installiert (falls noch nicht geschehen), alle zugehörigen GNU-Dienstprogramme werden installiert (falls noch nicht geschehen) und die PATHVariable wird aus den installierten Dienstprogrammen erstellt.

#!/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
Clay Freeman
quelle
1
Lieben Sie nicht einfach die Abstimmungen ohne kritische Kommentare? Danke für das Drehbuch.
Justin Force
@JustinForce Kein Problem! Danke für die Rückmeldung.
Clay Freeman
2
-1. Dieses Skript macht zu viel Magie. Das ganze .bash_path-mangling ist nicht wirklich notwendig, wenn Sie @ user495470 und @ xuhdevs Antworten folgen. Und das Ändern von PS1 ist völlig ausgeschlossen.
Greg Dubicki
1
@ GregDubicki Leider ist für einige dieser Pakete der Bash-Pfad "mangling" erforderlich. Sie können dies selbst überprüfen. In Bezug auf das Ändern von PS1: Dieses Skript ist für den persönlichen Gebrauch. Jeder, der es wiederherstellen möchte, kann dies sehr einfach tun.
Clay Freeman
5

Ich habe ein Skript geschrieben, das die macOS CLI transparent in eine neue GNU / Linux CLI-Erfahrung umwandelt

  • fehlende GNU-Programme installieren
  • Aktualisieren veralteter GNU-Programme
  • Ersetzen vorinstallierter BSD-Programme durch ihre bevorzugte GNU-Implementierung
  • Installieren anderer Programme, die unter den gängigen GNU / Linux-Distributionen verbreitet sind

https://github.com/fabiomaia/linuxify

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

Sie können damit auch einfach alles rückgängig machen.

./linuxify uninstall
fabiomaia
quelle
1
Versuch, den ersten Befehl auszuführen ( git clone [email protected].:fabiomaia/linuxify.git) Der erste Befehl lautete "Die Authentizität des Hosts 'github.com' kann nicht festgestellt werden usw.". Ich tippte yesund drückte die Eingabetaste. Dann hieß es [email protected]: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.Was ist los?
Izogfif
@izogfif Versuchen Sie, stattdessen mit HTTPS zu git clone https://github.com/fabiomaia/linuxify.git
klonen
1
Ja, das hat funktioniert. Bitte aktualisieren Sie Ihre Antwort (entfernen Sie auch diese Dollars zu Beginn - sie werden kopiert, wenn Sie Text auswählen und in die Konsole kopieren).
Izogfif
@izogfif Danke für die Vorschläge.
Fabiomaia