Ersetzen Sie OS X Shell-Befehle mit den Linux-Versionen?

32

Die im Terminal in OS X standardmäßig verfügbaren Befehle scheinen sich nicht wie die Linux-Versionen zu verhalten. Wie kann ich sie alle durch die aktuellen GNU-Linux-Befehle ersetzen?

Zum Beispiel erfordert sed -i ein nerviges zusätzliches Argument. Es funktioniert auch nur mit Textdateien. Das ist sinnlos.

Der Eine
quelle
1
Umm ... sed ist ein "Texteditor", der auch Binärdateien bearbeiten kann. Was soll es sonst noch tun? Bitte erklären Sie, was genau Sie brauchen. Ich kann Ihr Problem nicht verstehen. Können Sie weitere Beispiele nennen?
Terdon
3
Eigentlich sed ist ein Stream - Editor . Nicht umständlich zu sein, sondern um Dateien zu modifizieren, es sei denn, es handelt sich um Streams. Das ist genau der Grund, warum die -iFlagge nicht dem Standard entspricht . eddient zum Bearbeiten von Dateien.
Kojiro

Antworten:

43

Im Allgemeinen können (oder sollten ) Sie die Standardbefehle überhaupt nicht ersetzen. Der Grund dafür ist, dass viele Systemverwaltungsskripte und Pakete von Drittanbietern wahrscheinlich auf diese Befehle angewiesen sind, um sich so zu verhalten, wie sie es von Anfang an unter OS X tun.

Wenn Sie also nur die Systembefehle löschen und durch GNU-Äquivalente mit inkompatiblem Verhalten oder Befehlszeilenargumenten ersetzen, wird dies wahrscheinlich zu Problemen führen. Insbesondere, wenn Sie eine Software verwenden, die nach dem ursprünglichen Entwurf für Linux oder BSD auf Mac OS X "portiert" wurde, da diese Arten von Programmen eher auf Shell-Skripten und Systembefehlen beruhen als auf dem Aufrufen von OS X-APIs.

Sie können eine Umgebung installieren, in der die GNU-Dienstprogramme in einem anderen Verzeichnis installiert werden, ohne die Standardeinstellungen zu überschreiben, und dann Ihre PATHUmgebungsvariable so anpassen , dass sie den Befehlen im GNU-Verzeichnis Vorrang einräumt, bevor sie überhaupt die Systemverzeichnisse durchsucht. Sie können dies so verkabeln, dass Ihr PFAD nur dann auf diese Weise festgelegt wird, wenn Sie eine interaktive Shell starten. Sie können googeln, wie man das macht, bashoder eine andere Frage zu SU stellen (oder danach suchen, da sie wahrscheinlich schon einmal gestellt wurde), wenn Sie das möchten.

Ein Beispiel für eine solche Umgebung ist Homebrew, das zum Beispiel sedunter anderem GNU hat . Sobald Sie Homebrew installiert haben, können Sie eingeben

brew install coreutils

und installiere die GNU Coreutils . Dies wird Ihnen mit sed, date, printf, wcund viele andere Tools , dass Schiff mit GNU / Linux, aber nicht OS X. Allerdings, um nicht zu „überschreiben“ default OS X Binärdateien, werden sie mit dem Präfix werden gstandardmäßig aktiviert . Wenn Sie also nach der Installation von Coreutils GNU sed verwenden möchten, geben Sie Folgendes ein

gsed

Wenn dies zu umständlich ist, können Sie Ihrem PATH ein "gnubin" -Verzeichnis hinzufügen und GNU sed mit aufrufen sed. Sie müssen Folgendes zu Ihrer hinzufügen ~/.bash_profile:

PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"

Wenn Sie eine Linux-Umgebung benötigen, die von Suppe bis Nuts reicht (Kernel, X11, Syscall-Kompatibilität usw.), müssen Sie Linux auf einer virtuellen Maschine wie VirtualBox ausführen . Dies ist eine sichere Sache, wenn Sie Software oder Skripte ausführen müssen, die für Linux entwickelt wurden.

Homebrew bietet Kompatibilität nur für bestimmte Programmklassen, für die kein Linux-spezifisches Verhalten erforderlich ist. Zum Beispiel inotifyist nur unter Linux verfügbar. drm(der Direct Rendering Manager) ist nur unter Linux verfügbar. Es gibt einige andere eher einfache Systemaufrufe, die nur unter Linux verfügbar sind und für die es unter OS X kein Äquivalent gibt. Daher kann das Portieren bestimmter Programme von Linux nach OS X ohne wesentliche Codeänderungen unpraktisch oder unmöglich sein.

allquixotic
quelle
Es gibt immer Boot Camp . :)
Kojiro
13
Aus irgendeinem Grund brew install coreutilsnicht enthalten sed. Sie können dies brew install gnu-sedjedoch installieren gsedund nicht sed, selbst wenn Sie Ihre aktualisieren $PATH. Ich habe einen Symlink erstellt, um Macs auszublenden sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedSie müssen jedoch noch einen Link erstellen, um man gseddie richtige Manpage anzuzeigen.
dimo414
6
brew install gnu-sed --default-namesInstalliere es alssed
ivotron
1
Stattdessen --default-nameskönnen Sie mit den Befehlen mit dem Präfix g installieren und dann oh-my-zsh (sehr empfehlenswert) installieren und das Plugin gnu-utils aktivieren.
Bibstha
3

Sie können ein Gentoo-Präfix verwenden, das OS X unterstützt, indem Sie es booten und dann die relevanten Pfade im Präfixverzeichnis zu Ihrem PATH hinzufügen. Es kann sein, dass dies bereits für Sie erledigt. Nachdem Sie dies getan haben, können Sie Standard-Gentoo-Befehle zum Installieren von Paketen verwenden.

emerge coreutils erhalten Sie zum Beispiel die Standard-GNU-Utils.

Bitte beachten Sie, dass Gentoo standardmäßig kompiliert. Möglicherweise möchten Sie stattdessen einen binären Host einrichten . Dies ist nur mit einer der URLs in der zweiten Hälfte dieses Artikels, und es bei der Platzierung PORTAGE_BINHOST="... your url here ..."in ./etc/make.confin Ihrem Präfix.

Tamara Wijsman
quelle
1

Im Anschluss an den Beitrag von @ allquixotic finden Sie hier die offiziellen Anweisungen per brew install coreutils

Alle Befehle wurden mit dem Präfix 'g' installiert.

Wenn Sie diese Befehle wirklich mit ihrem normalen Namen verwenden müssen, können Sie von Ihrem bashrc aus wie folgt ein "gnubin" -Verzeichnis zu Ihrem PATH hinzufügen

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

Darüber hinaus können Sie auch von Ihrem bashrc aus auf deren Manpages mit normalen Namen zugreifen, das Verzeichnis "gnuman" zu Ihrem MANPATH

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

In Bezug auf sedSie können eine vorkompilierte Binärdatei aus dem RudixProjekt herunterladen . Weitere RudixPauschalen finden Sie hier und hier .

Kerny
quelle