Замініть команди оболонки OS X версіями Linux?


32

Команди, доступні за замовчуванням у терміналі в OS X, схоже, не поводяться як їх версії Linux. Як я можу замінити їх усіма фактичними командами Linux GNU?

Наприклад, sed -i вимагає прикро додаткових аргументів. Також він працює лише з текстовими файлами. Це марно.


1
Гм ... sed - це "текстовий редактор", він також може змінювати двійкові файли. Що б ти хотів це зробити? Поясніть, будь ласка, що саме вам потрібно. Я не можу зрозуміти вашу проблему, чи можете ви навести ще кілька прикладів?
тердон

3
Власне, sed - редактор потоків . Це не бути педантичним, але насправді це не призначене для зміни файлів, якщо ці файли не є потоками. Саме тому -iпрапор є нестандартним . edпризначений для редагування файлів.
kojiro

Відповіді:


43

У загальному випадку ви взагалі не можете (або не повинні ) замінювати команди за замовчуванням. Причина полягає в тому, що багато сценарії системного адміністрування та сторонні пакети, ймовірно, покладаються на ці команди, щоб вони поводилися так, як вони роблять поза коробки в OS X.

Тож якщо ви просто стерте системні команди та заміните їх на еквіваленти GNU, які мають несумісну поведінку чи аргументи командного рядка, це, ймовірно, щось порушить. Особливо, якщо ви використовуєте якесь програмне забезпечення, яке було "перенесено" на Mac OS X після того, як він був спочатку розроблений для роботи на Linux або BSD, оскільки ці типи програм швидше покладаються на сценарії оболонки та системні команди на відміну від виклику API OS X.

Що ви можете зробити, це встановити середовище, яке встановлює утиліти GNU в інший каталог, не перезаписуючи параметри за замовчуванням, а потім відрегулювати PATHзмінну середовища так, щоб вона надавала пріоритет командам, знайденим у каталозі GNU, перш ніж вона навіть шукатиме системні каталоги. Ви можете зв’язати це так, щоб він встановлював лише ваш PATH таким чином, якщо ви запускаєте інтерактивну оболонку; ви можете google, як це зробити, bashабо задати інше запитання щодо SU (або шукати його, оскільки це, мабуть, вже задавались), якщо ви хочете це зробити.

Прикладом такого середовища є Homebrew, який, наприклад, має GNU sedсеред іншого. Після встановлення Homebrew ви можете вводити текст

brew install coreutils

і встановити GNU Coreutils . Це забезпечить вам sed, date, printf, wcі багато інших інструментів , які поставляються з GNU / Linux, але не OS X. Тим НЕ менше, щоб не «скасовують» ОС по замовчуванням X виконавчі файли, вони будуть з префіксом gза замовчуванням. Отже, після установки Coreutils, якщо ви хочете використовувати GNU sed, введіть

gsed

Якщо це занадто багато клопоту щоразу набирати, ви можете додати каталог "gnubin" у свій PATH та просто зателефонувати з GNU sed sed. Вам потрібно буде додати наступне ~/.bash_profile:

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

Звичайно, якщо вам потрібне середовище Linux від супу до горіхів (ядро, X11, сумісність syscall тощо), вам доведеться запустити Linux у віртуальній машині, наприклад VirtualBox . Це безпечна ставка, якщо вам потрібно запустити програмне забезпечення або сценарії, розроблені для роботи в Linux.

Homebrew надасть вам сумісність лише для певних класів програм, які не вимагають поведінки, характерної для Linux. Наприклад inotify, доступний лише в Linux. drm(Менеджер прямого рендерінгу) доступний лише в Linux. Існують деякі інші досить низькі рівні системних викликів, які доступні лише в Linux, і для яких немає жодного еквівалента в OS X, тому перенесення певних програм з Linux на OS X може бути непрактичним або неможливим без значних змін коду.


Завжди є Boot Camp . :)
kojiro

13
З будь-якої причини brew install coreutilsне входить sed. Ви можете зробити brew install gnu-sedце встановленням, gsedале ні sed, навіть якщо ви оновите свій $PATH. Я створив символічне посилання , щоб приховати Мака sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedТим НЕ менше ви все ще повинні зробити , man gsedщоб побачити правильну сторінку керівництва.
dimo414

6
brew install gnu-sed --default-namesвстановить його якsed
ivotron

1
Замість цього --default-namesви можете встановити за допомогою команд g-префікси, а потім встановити oh-my-zsh (настійно рекомендується) та включити плагін gnu-utils.
bibstha

3

Ви можете використовувати префікс Gentoo, який підтримує OS X, це можна зробити, завантаживши його, а потім додавши відповідні шляхи в каталозі префіксів до вашої PATH. Можливо, це вже робить це для вас. Після цього ви можете використовувати стандартні команди Gentoo для встановлення пакетів.

emerge coreutils отримає, наприклад, стандартні утиліти GNU.

Зверніть увагу, що Gentoo компілює за замовчуванням, ви можете замість цього встановити двійковий хост . Це тільки з допомогою одного з URL - адрес на другій половині цієї статті, і помістити його в PORTAGE_BINHOST="... your url here ..."в ./etc/make.confвашій приставкою.


1

Як наступні публікації до публікації @ allquixotic, ось офіційні вказівки за brew install coreutils

Всі команди були встановлені з префіксом 'g'.

Якщо вам справді потрібно використовувати ці команди зі своїм звичайним іменем, ви можете додати каталог "gnubin" у свій PATH з вашого bashrc, як

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

Крім того, ви можете отримати доступ до їхніх сторінок із звичайними назвами до каталогу "gnuman" до вашої MANPATH також від вашого bashrc

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

0

Щодо sedвас, ви можете завантажити попередньо складений двійковий файл із Rudixпроекту. Про подальші Rudixпакунки дивіться тут і тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.