Sostituisci i comandi della shell di OS X con le versioni di linux?


32

I comandi disponibili per impostazione predefinita nel Terminale in OS X, non sembrano comportarsi come le loro versioni di Linux. Come posso sostituirli tutti con i comandi GNU Linux attuali?

Ad esempio, sed -i richiede un "" argomento fastidiosamente aggiuntivo. Inoltre, funziona solo con file di testo. Questo è inutile.


1
Umm ... sed è un "editor di testo", può anche modificare file binari. Cos'altro vorresti che facesse? Per favore, spiega di cosa hai esattamente bisogno. Non riesco a capire il tuo problema, potresti fare qualche esempio in più?
terdon,

3
In realtà, sed è un editor di stream . Non essere pedante, ma in realtà non è pensato per modificare i file, a meno che quei file non siano flussi. Questo è esattamente il motivo per cui la -ibandiera non è standard . edè per la modifica dei file.
Kojiro,

Risposte:


43

Nel caso generale, non è possibile (o non si dovrebbe ) sostituire affatto i comandi predefiniti. Il motivo è che molti script di amministrazione del sistema e pacchetti di terze parti probabilmente si basano su questi comandi per comportarsi come sono pronti all'uso su OS X.

Quindi, se cancelli semplicemente i comandi di sistema e li sostituisci con equivalenti GNU che hanno comportamenti incompatibili o argomenti della riga di comando, probabilmente romperà qualcosa. Soprattutto se si utilizza un software che è stato "portato" su Mac OS X dopo essere stato originariamente progettato per essere eseguito su Linux o BSD, poiché questi tipi di programmi hanno maggiori probabilità di fare affidamento su script di shell e comandi di sistema rispetto alla chiamata di API OS X.

Quello che puoi fare è installare un ambiente che installa i programmi di utilità GNU in un'altra directory senza sovrascrivere i valori predefiniti e quindi regolare la PATHvariabile di ambiente modo che dia la priorità ai comandi trovati all'interno della directory GNU prima ancora di cercare nelle directory di sistema. Puoi collegarlo in modo tale da impostare il tuo PERCORSO in quel modo solo se stai avviando una shell interattiva; puoi google come farlo basho fare un'altra domanda su SU (o cercarla, dal momento che probabilmente è stata posta in precedenza) se vuoi farlo.

Un esempio di tale ambiente è l' homebrew che ad esempio ha GNU sedtra le altre cose. Dopo aver installato Homebrew, puoi digitare

brew install coreutils

e installa GNU Coreutils . Questi vi fornirà sed, date, printf, wce molti altri strumenti forniti con GNU / Linux, ma non OS X. Tuttavia, in modo da non binari OS X di default "override", saranno preceduti dal prefisso gdi default. Quindi, dopo aver installato Coreutils, se si desidera utilizzare GNU sed, digitare

gsed

Se questo è troppo fastidioso da digitare ogni volta, puoi aggiungere una directory "gnubin" al tuo PATH e chiamare GNU sed con sed. Dovrai aggiungere quanto segue al tuo ~/.bash_profile:

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

Ovviamente, se hai bisogno di un ambiente Linux dalla zuppa alle noci (kernel, X11, compatibilità syscall, ecc.) Dovrai eseguire Linux in una macchina virtuale, come VirtualBox . Questa è una scommessa sicura se è necessario eseguire software o script progettati per essere eseguiti su Linux.

Homebrew ti garantirà la compatibilità solo per alcune classi di programmi che non richiedono un comportamento specifico di Linux. Ad esempio inotifyè disponibile solo su Linux. drm(Direct Rendering Manager) è disponibile solo su Linux. Esistono altre chiamate di sistema di livello piuttosto basso che sono disponibili solo su Linux e per le quali non esiste un equivalente su OS X, pertanto il porting di determinati programmi da Linux a OS X può essere impraticabile o impossibile senza significative modifiche al codice.


C'è sempre Boot Camp . :)
Kojiro,

13
Per qualunque motivo brew install coreutilsnon includa sed. Puoi fare brew install gnu-sedcomunque questa installazione gsede non sed, anche se aggiorni il tuo $PATH. Ho creato un link simbolico per nascondere i Mac sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedtuttavia devi ancora fare man gsedper vedere la manpage giusta.
dimo414

6
brew install gnu-sed --default-nameslo installerà comesed
ivotron il

1
Invece --default-names, puoi installarlo con i comandi con prefisso g e quindi installare oh-my-zsh (altamente raccomandato) e abilitare il plugin gnu-utils.
bibstha,

3

Puoi usare un prefisso Gentoo che supporta OS X, puoi farlo avviandolo e quindi aggiungendo i percorsi pertinenti nella directory prefisso al tuo PERCORSO. Potrebbe essere che questo lo faccia già per te. Dopo averlo fatto, puoi usare i comandi Gentoo standard per installare i pacchetti.

emerge coreutils ti fornirà i programmi di utilità GNU standard, per esempio.

Nota che Gentoo si compila di default, potresti invece voler configurare un host binario . Questo è solo utilizzando uno degli URL nella seconda metà di tale articolo, e ponendolo in PORTAGE_BINHOST="... your url here ..."in ./etc/make.confnel vostro prefisso.


1

A seguito del post di @ allquixotic, ecco le istruzioni ufficiali per brew install coreutils

Tutti i comandi sono stati installati con il prefisso 'g'.

Se hai davvero bisogno di usare questi comandi con il loro nome normale puoi aggiungere una directory "gnubin" al tuo PERCORSO dal tuo bashrc come

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

Inoltre, puoi accedere alle loro pagine man con nomi normali dalla directory "gnuman" al tuo MANPATH anche dal tuo bashrc

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

0

Per quanto riguarda l' sedutente, è possibile scaricare un file binario precompilato dal Rudixprogetto. Per ulteriori Rudixpacchetti vedere qui e qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.