32

Команды, доступные по умолчанию в Терминале в OS X, похоже, ведут себя не так, как их версии для Linux. Как я могу заменить их все действующими командами GNU linux?

Например, sed -i требует раздражающе дополнительного аргумента "". Кроме того, он работает только с текстовыми файлами. Это бесполезно.

4 ответа4

43

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

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

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

Примером такой среды является Homebrew, в котором, например, есть GNU sed . После того, как вы установили Homebrew, вы можете набрать

brew install coreutils

и установите GNU Coreutils. Они предоставят вам sed , date , printf , wc и многие другие инструменты, которые поставляются с GNU/Linux, но не с OS X. Однако, чтобы не "переопределять" стандартные двоичные файлы OS 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 (Direct Rendering Manager) доступен только в Linux. Существуют некоторые другие довольно низкоуровневые системные вызовы, которые доступны только в Linux и для которых нет эквивалента в OS X, поэтому перенос некоторых программ из Linux в OS X может быть непрактичным или невозможным без существенных изменений кода.

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"

Кроме того, вы можете получить доступ к их man-страницам с обычными именами, каталогом "gnuman" для вашей MANPATH, также из вашего bashrc

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

Что касается sed вы можете скачать скомпилированный двоичный файл из проекта Rudix. Для дальнейших пакетов Rudix смотрите здесь и здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .