Zastąpić polecenia powłoki OS X wersjami Linux?

32

Polecenia dostępne domyślnie w Terminalu w OS X, nie zachowują się tak, jak ich wersje Linux. Jak mogę je wszystkie zastąpić rzeczywistymi poleceniami GNU Linux?

Na przykład sed -i wymaga dodatkowego irytującego argumentu. Działa również tylko z plikami tekstowymi. To jest bezużyteczne.

Jeden
źródło
1
Umm ... sed jest „edytorem tekstu”, może także modyfikować pliki binarne. Co jeszcze byś chciał? Proszę wyjaśnić, czego dokładnie potrzebujesz. Nie rozumiem twojego problemu, czy możesz podać więcej przykładów?
terdon
3
Sed jest edytorem strumieniowym . Nie jest pedantyczny, ale tak naprawdę nie jest przeznaczony do modyfikowania plików, chyba że te pliki są strumieniami. Właśnie dlatego -iflaga jest niestandardowa . edsłuży do edycji plików.
kojiro

Odpowiedzi:

43

W ogólnym przypadku nie można (lub nie należy ) zastępować domyślnych poleceń. Powodem jest to, że wiele skryptów administracyjnych systemu i pakietów firm trzecich prawdopodobnie polega na tych poleceniach, aby zachowywać się tak, jak działają po wyjęciu z pudełka w systemie OS X.

Więc jeśli po prostu wyczyścisz polecenia systemowe i zastąpisz je odpowiednikami GNU, które mają niezgodne zachowanie lub argumenty wiersza poleceń, prawdopodobnie coś zepsuje. Zwłaszcza jeśli korzystasz z oprogramowania, które zostało „przeniesione” do Mac OS X po tym, jak pierwotnie zostało zaprojektowane do pracy w systemie Linux lub BSD, ponieważ tego rodzaju programy częściej polegają na skryptach powłoki i poleceniach systemowych niż na wywoływaniu API OS X.

To, co możesz zrobić, to zainstalować środowisko, które instaluje narzędzia GNU w innym katalogu bez nadpisywania wartości domyślnych, a następnie dostosuj PATHzmienną środowiskową, aby dawała pierwszeństwo poleceniom znajdującym się w katalogu GNU, zanim przeszuka katalogi systemowe. Możesz to załączyć tak, aby ustawiało w ten sposób PATH tylko wtedy, gdy uruchamiasz interaktywną powłokę; możesz google, jak to zrobić, bashlub zadać inne pytanie na SU (lub poszukać go, ponieważ prawdopodobnie zostało to wcześniej zadane), jeśli chcesz to zrobić.

Przykładem takiego środowiska jest Homebrew, który na przykład ma GNU sedmiędzy innymi. Po zainstalowaniu Homebrew możesz pisać

brew install coreutils

i zainstaluj GNU Coreutils . Będą one zapewnić Państwu sed, date, printf, wcoraz wiele innych narzędzi, które są dostarczane z systemu GNU / Linux, lecz nie OS X. Jednak, tak aby nie „Zastąp” default OS X binaria, będą one prefiksem gdomyślnie. Więc po zainstalowaniu Coreutils, jeśli chcesz używać GNU sed, wpisz

gsed

Jeśli jest to zbyt kłopotliwe do wpisywania za każdym razem, możesz dodać katalog „gnubin” do PATH i po prostu wywołać GNU sed sed. Musisz dodać do swojego ~/.bash_profile:

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

Oczywiście, jeśli potrzebujesz środowiska Linux od zupy do orzechów (jądro, X11, kompatybilność syscall itp.), Będziesz musiał uruchomić Linuksa na maszynie wirtualnej, takiej jak VirtualBox . Jest to bezpieczny zakład, jeśli potrzebujesz uruchomić oprogramowanie lub skrypty zaprojektowane do działania w systemie Linux.

Homebrew zapewni kompatybilność tylko dla niektórych klas programów, które nie wymagają zachowania specyficznego dla Linuksa. Na przykład inotifyjest dostępny tylko w systemie Linux. drm(Direct Rendering Manager) jest dostępny tylko w systemie Linux. Istnieją również inne raczej systemowe wywołania systemowe, które są dostępne tylko w systemie Linux i dla których nie istnieje odpowiednik w systemie OS X, więc przenoszenie niektórych programów z systemu Linux na system OS X może być niepraktyczne lub niemożliwe bez znacznych zmian w kodzie.

allquixotic
źródło
Zawsze jest Boot Camp . :)
kojiro
13
Z jakiegokolwiek powodu brew install coreutilsnie obejmuje sed. Można zrobić brew install gnu-sedto jednak instaluje gsedi nie sed, nawet jeśli zaktualizowanie $PATH. Stworzyłem dowiązanie symboliczne, aby ukryć Maca sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedjednak wciąż musisz zrobić, man gsedaby zobaczyć odpowiednią stronę podręcznika.
dimo414
6
brew install gnu-sed --default-nameszainstaluje go jakosed
ivotron
1
Zamiast tego --default-namesmożesz zainstalować za pomocą poleceń z prefiksem g, a następnie zainstalować oh-my-zsh (wysoce zalecane) i włączyć wtyczkę gnu-utils.
bibstha
3

Możesz użyć prefiksu Gentoo, który obsługuje system OS X, możesz to zrobić, ładując go, a następnie dodając odpowiednie ścieżki w katalogu prefiksów do PATH. Możliwe, że już to dla ciebie robi. Po wykonaniu tej czynności możesz użyć standardowych poleceń Gentoo do instalowania pakietów.

emerge coreutils dostarczy ci na przykład standardowe narzędzia GNU.

Pamiętaj, że Gentoo kompiluje się domyślnie, zamiast tego możesz chcieć skonfigurować hosta binarnego . To jest tylko przy użyciu jednego z adresów URL w drugiej połowie tego artykułu, a umieszczenie go w PORTAGE_BINHOST="... your url here ..."w ./etc/make.confw prefiksie.

Tamara Wijsman
źródło
1

Jako kontynuacja posta @ allquixotic, oto oficjalne instrukcje na brew install coreutils

Wszystkie polecenia zostały zainstalowane z prefiksem „g”.

Jeśli naprawdę potrzebujesz użyć tych poleceń z ich normalną nazwą, możesz dodać katalog „gnubin” do PATH z twojego bashrc jak

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

Dodatkowo możesz uzyskać dostęp do ich stron man o normalnych nazwach katalog „gnuman” do twojego MANPATH również z twojego bashrc

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
użytkownik72923
źródło
0

W odniesieniu do sedciebie możesz pobrać wstępnie skompilowany plik binarny z Rudixprojektu. Więcej Rudixpakietów znajdziesz tutaj i tutaj .

kerny
źródło