Remplacer les commandes du shell d'OS X par les versions de Linux?


32

Les commandes disponibles par défaut dans le Terminal sous OS X ne semblent pas se comporter comme leurs versions Linux. Comment puis-je les remplacer par les commandes GNU Linux réelles?

Par exemple, sed -i nécessite un "" argument supplémentaire ennuyant. En outre, cela ne fonctionne qu'avec des fichiers texte. C'est inutile.


1
Umm ... sed est un "éditeur de texte", il peut également modifier des fichiers binaires. Que voudriez-vous qu'il fasse? S'il vous plaît expliquer ce dont vous avez besoin exactement. Je ne comprends pas votre problème, pourriez-vous donner d'autres exemples?
Terdon

3
En fait, sed est un éditeur de flux . Ne pas être pédant, mais ce n’est pas censé modifier des fichiers, à moins que ces fichiers ne soient des flux. C'est précisément pourquoi le -idrapeau est non standard . edest pour éditer des fichiers.
kojiro

Réponses:


43

Dans le cas général, vous ne pouvez pas (ou ne devriez pas ) remplacer les commandes par défaut. La raison en est que de nombreux scripts d'administration système et des packages tiers s'appuient probablement sur ces commandes pour se comporter comme ils le font immédiatement sous Mac X.

Donc, si vous supprimez simplement les commandes système et les remplacez par des équivalents GNU ayant un comportement ou des arguments de ligne de commande incompatibles, cela cassera probablement quelque chose. Surtout si vous utilisez des logiciels "portés" sur Mac OS X après avoir été conçus à l'origine pour Linux ou BSD, car ces types de programmes sont plus susceptibles de s'appuyer sur des scripts shell et des commandes système plutôt que d'appeler des API OS X.

Ce que vous pouvez faire est d'installer un environnement qui installe les utilitaires GNU dans un autre répertoire sans remplacer les valeurs par défaut, puis d' ajuster votre PATHvariable d'environnement afin qu'elle donne la priorité aux commandes trouvées dans le répertoire GNU avant même d'effectuer une recherche dans les répertoires système. Vous pouvez câbler cela pour qu'il ne définisse votre PATH de cette façon que si vous démarrez un shell interactif; vous pouvez google comment faire cela bashou poser une autre question sur SU (ou la rechercher, car on vous l'a probablement déjà demandé) si vous voulez le faire.

Un exemple d'un tel environnement est Homebrew qui, par exemple, utilise GNU sedentre autres. Une fois que vous avez installé Homebrew, vous pouvez taper

brew install coreutils

et installez GNU Coreutils . Ceux - ci vous fournira sed, date, printf, wcet bien d' autres outils livrés avec GNU / Linux, mais pas OS X. Cependant, pour ne pas par défaut « outrepasser » OS X binaires, ils seront préfixées avec gpar défaut. Donc, après avoir installé Coreutils, si vous voulez utiliser GNU sed, tapez

gsed

Si c'est trop compliqué à taper à chaque fois, vous pouvez ajouter un répertoire "gnubin" à votre PATH et simplement appeler GNU sed avec sed. Vous devrez ajouter ce qui suit à votre ~/.bash_profile:

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

Bien sûr, si vous avez besoin d’un environnement Linux complet (noyau, X11, compatibilité système, etc.), vous devrez exécuter Linux sur une machine virtuelle, telle que VirtualBox. . C’est une valeur sûre si vous devez exécuter un logiciel ou des scripts conçus pour Linux.

Homebrew ne vous permettra la compatibilité que pour certaines classes de programmes ne nécessitant pas de comportement spécifique à Linux. Par exemple, inotifyn'est disponible que sous Linux. drm(Direct Rendering Manager) n’est disponible que sous Linux. Il existe certains autres appels système de bas niveau qui ne sont disponibles que sous Linux et pour lesquels aucun équivalent n'existe sous OS X; par conséquent, le portage de certains programmes de Linux vers OS X peut s'avérer peu pratique ou impossible sans modifications majeures du code.


Il y a toujours des camps d'entraînement . :)
kojiro

13
Pour une raison quelconque brew install coreutilsne comprend pas sed. Vous pouvez faire brew install gnu-sedcependant cela installe gsedet pas sed, même si vous mettez à jour votre $PATH. J'ai créé un lien symbolique pour masquer les Mac sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedtoutefois, vous devez encore man gsedvoir la bonne page de manuel.
Dimo414

6
brew install gnu-sed --default-namesva l'installer en tant quesed
ivotron

1
Au lieu de --default-names, vous pouvez installer avec les commandes g-prefixed, puis installer oh-my-zsh (hautement recommandé) et activer le plug-in gnu-utils.
bibstha

3

Vous pouvez utiliser un préfixe Gentoo prenant en charge OS X, vous pouvez le faire en l’ amorçant puis en ajoutant les chemins correspondants dans le répertoire du préfixe à votre PATH. Il se peut que cela le fasse déjà pour vous. Une fois que vous avez terminé, vous pouvez utiliser les commandes Gentoo standard pour l’installation de packages.

emerge coreutils vous obtiendrez par exemple les utilitaires GNU standard.

Veuillez noter que Gentoo compile par défaut, vous pouvez éventuellement configurer un hôte binaire . Ceci est juste en utilisant l' une des URL sur la seconde moitié de cet article et de le placer dans PORTAGE_BINHOST="... your url here ..."dans ./etc/make.confvotre préfixe.


1

Pour faire suite au message de @ allquixotic, voici les instructions officielles brew install coreutils

Toutes les commandes ont été installées avec le préfixe 'g'.

Si vous avez vraiment besoin d’utiliser ces commandes avec leur nom habituel, vous pouvez ajouter un répertoire "gnubin" à votre PATH depuis votre bash comme

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

De plus, vous pouvez accéder à leurs pages de manuel avec les noms normaux du répertoire "gnuman" sur votre MANPATH depuis votre bashrc.

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

0

En ce qui sedvous concerne, vous pouvez télécharger un fichier binaire précompilé à partir du Rudixprojet. Pour d'autres Rudixforfaits, voir ici et ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.