Wie ersetzt man Mac OS X-Dienstprogramme durch GNU-Core-Dienstprogramme?

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

Wie kann ich alle meine Mac-Dienstprogramme durch GNU-Dienstprogramme ersetzen?

Hier ist eine Anleitung topbug.net/blog/2013/04/14/…
Ich sympathisiere mit Ihrer Frustration, aber ich glaube, dass es langfristig zu größerer Frustration führen wird, wenn sie ersetzt werden - Nachdem ich versucht habe, dasselbe zu tun, würde ich empfehlen, homebrewwie unten erwähnt zu verwenden und dann einfach zu lernen, die Dienstprogramme mit zu verwenden a g( gsed, greadlink, etc ), anstatt die Systemdienstprogramme zu ersetzen.
Informationen zu grep finden Sie unter apple.stackexchange.com/questions/193288/…
Ich bin mit @cwd nicht einverstanden, die Verwendung --with-default-namesbetrifft nur den lokalen Benutzer. Es könnte ein Problem mit Mac-orientierten Terminaldienstprogrammen sein, aber wenn Sie Homebrew für alles verwenden, können 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 zu Hause.
HINWEIS: cpund mvkann für die erweiterten Attribute der Datei gefährlich sein (z. B. Tags, unsichtbar, Alias, Bündel und mehr). Einzelheiten finden Sie in diesen beiden Artikeln: brettterpstra.com/2014/07/03/… brettterpstra.com/2014/07/04/how-to-lose-your-tags Sie sind ein wenig veraltet, aber ich möchte nur erhöhen die Warnung, damit Sie untersuchen können, ob Sie GNUs verwenden mvund cpIhre Anforderungen beeinträchtigen.
Hat jemand ein konkretes Beispiel, das zeigt, dass dies "größere Frustration hervorrufen wird"?
@cambunctious Konkretes Beispiel: Ein Skript, das das Standarddienstprogramm für Ihr System verwendet, bricht zusammen.
@DeNovo das ist nicht konkret
@boileau Ich würde sagen, es ist konkret genug. Jedes Installationsskript für ein Paket, das versucht, Ihre Standarddienstprogramme basierend auf Ihrem Betriebssystem zu verwenden, kann fehlschlagen oder seltsame Dinge tun und seltsame Fehler verursachen. Das wäre ziemlich schmerzhaft, denke ich. Wann es passieren wird, wer weiß, aber es ist ziemlich wahrscheinlich!
@CodeNovitiate Entschuldigung, aber zu sagen "hier ist eine vage Kategorie von Dingen, die passieren könnten", ist nicht konkret. Konkret wäre ein Link zu einem Skript, das fehlschlägt, und eine Beschreibung, wie.

Antworten (6)

Dies fügt symbolische Links für GNU-Dienstprogramme mit dem Präfix g hinzu /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 ag-Präfix verwenden möchten, fügen Sie beispielsweise /usr/local/opt/coreutils/libexec/gnubinvor anderen Verzeichnissen auf Ihrer 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"
FWIW, ich habe eine Homebrew-Formel, die als Metapaket für all diese großartigen GNU-Dienstprogramme fungiert: shiny-and-gnu.rbsiehe github.com/al-the-x/homebrew-mine
Der erste PATH funktioniert, aber MANPATH ist fehlgeschlagen, warum? Liegt es daran, dass ich OSX10.10 verwende? Ich wiederholte $MANPATH, und ich bekam /usr/local/opt/coreutils/libexec/gnuman:, anscheinend war ursprünglich MANPATH nicht enthalten. Nachdem ich die MANPATH-conf in meinem bashrc auskommentiert hatte, bekam ich nichts von ecoh $MANPATH. Und natürlich, wenn ich benutze man pwd, habe ich das BSD-Handbuch bekommen. Wie kann man das beheben?
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.
Um die richtige Manpage für zu erhalten findutils, fügen Sie diese außerdem zu Ihrer hinzu$MANPATH /usr/local/opt/findutils/share/man
@Zen: Der richtige Weg zum Initiieren MANPATH, um den Standardsystemwert beizubehalten, ist: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". Der Schlüssel liegt im Konstrukt ${var-default_value}.
Gibt es ein Paket, das alle diese Tools auf einmal installiert?
Ich führe dies aus, um Symlinks in meinem ~/bin-Verzeichnis zu generieren: utilDir=coreutils/8.25; cp -a /usr/local/Cellar/${utilDir}/libexec/gnubin/* ~/binÄndern Sie einfach die utilDirfür jeden Satz von Dienstprogrammen, die Sie verknüpfen möchten. Dann kann ich einfach `PATH="/home/me/bin:$PATH" setzen, ohne so ein Durcheinander mit verschiedenen Verzeichnissen zu machen.
@danielAzuelos, es scheint, dass dein Snippet einige seltsame Unicode-Zeichen enthält, die beim Kopieren und Einfügen angezeigt werden: i.imgur.com/qQWygg2.png
@Sridhar-Sarnobat Wofür ist das?
Ich erinnere mich nicht. Aber ich brauchte es, damit meins funktionierte. Ich denke, es würde nicht die GNU-Version von findoder ein anderes gängiges Programm verwenden, was Sie immer erkennen können, wenn Sie einen Fehler findohne ein Verzeichnisargument erhalten.
Einstellen PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"hat geholfen. Danke!

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 seit Januar 2019 entfernt wurde, sodass jede Binärdatei dem Pfad hinzugefügt werden muss, wenn sie ohne das gPräfix verwendet werden soll.

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

Beachten Sie, dass brew install gawk(im Gegensatz zu allen anderen) awk(über einen symbolischen Link /usr/local/bin/awk) ersetzt wird. Wenn Sie das Original behalten möchten /usr/bin/awk, einfachrm /usr/local/bin/awk
Ist eine GNU-Version von pingverfügbar?
@HappyFace Ich glaube nicht. Unter GNU/Linux ist dies pingein Linux-Kernel-Dienstprogramm: github.com/iputils/iputils

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, wenn Sie von Linux kommen und Zugang zu "allgemeineren" *nix-Hilfsprogrammen und einem apt-ähnlichen System wünschen, dann würde ich empfehlen, sich Macports anzusehen: http://www.macports.org

Es ermöglicht beispielsweise die Verwendung des neuesten "generischen" GCC im Gegensatz zu/zusätzlich zu Apples enthaltenem GCC, nur als Beispiel.

Beispielsweise kennen tar und zip von Mac OS X Metadaten, die die GNU-Versionen nicht kennen.
Es gibt von Apple bereitgestellte Apps, die nur GUIs für einige Befehlszeilen-Tools sind, und wenn Sie sie ersetzen, verhalten sich die Apps möglicherweise seltsam, also fügen Sie sie hinzu und ersetzen Sie sie nicht.
Recht; etwas wie Macports fügt sie hinzu, ersetzt sie nicht.
Wenn Sie die GNU-Dienstprogramme standardmäßig mit MacPorts verwenden möchten, können Sie diese /opt/local/libexec/gnubinvor Ihrer PATHUmgebungsvariable hinzufügen.

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)
/bin/bash -c "$(curl -fsSL "\
"https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 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
[[ -f ~/.bash_path ]] && mv ~/.bash_path ~/.bash_path.orig

# 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

Ich habe ein Skript geschrieben, das die macOS-CLI transparent in ein frisches GNU/Linux-CLI-Erlebnis umwandelt

  • Installation fehlender GNU-Programme
  • Aktualisierung veralteter GNU-Programme
  • Ersetzen vorinstallierter BSD-Programme durch ihre bevorzugte GNU-Implementierung
  • Installieren anderer Programme, die unter gängigen GNU/Linux-Distributionen üblich sind

https://github.com/fabiomaia/linuxify

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

Es ermöglicht Ihnen auch, alles einfach rückgängig zu machen.

./linuxify uninstall
Beim Versuch, den ersten Befehl ( git clone git@github.com.:fabiomaia/linuxify.git) auszuführen, hieß es zuerst: "Die Authentizität des Hosts 'github.com' kann nicht festgestellt werden usw.". Ich tippte yesund drückte Enter. Dann hieß es: 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.Was ist los?
@izogfif Versuchen Sie stattdessen, mit HTTPS zu klonengit clone https://github.com/fabiomaia/linuxify.git
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 Vielen Dank für die Vorschläge.

Als Alternative zum Setzen der Umgebungsvariablen PATH und MANPATH (was ich eigentlich empfehlen würde) ist es auch möglich, Binärdateien wie folgt mit einem vorhandenen PATH-Speicherort zu verknüpfen:

Sie müssen wissen, wo Homebrew coreutilsBinärdateien installiert.

/usr/local/opt/coreutils/bin

In /usr/local/optdiesem Verzeichnis speichert Homebrew relativ statische Dateien, die sich zwischen Updates wahrscheinlich nicht ändern.

Dann können Sie von dort aus symbolische Links zu einem Ort erstellen, der sich bereits auf Ihrem PATH befindet. Es muss ein Pfad sein, der früh auf PATH geladen wird, weil der PATH nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ durchsucht wird. /usr/local/binist eine gute Wahl basierend auf der Betrachtung von echo $PATH.

which sha256sum # prove it is not on PATH
ln -s /usr/local/opt/coreutils/bin/sha256sum /usr/local/bin/
which sha256sum # prove it is on PATH

Auf diese Weise wäre es fast genauso einfach, symbolische Links zu erstellen. In einigen Fällen, z. B. wenn Sie eine strengere Kontrolle wünschen, ist dies eine gute Option, anstatt ein ganzes Verzeichnis zu Ihrem PATH und MANPATH hinzuzufügen.