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


32

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

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


1
Умм ... sed - это "текстовый редактор", он также может изменять двоичные файлы. Что еще вы хотели бы это сделать? Пожалуйста, объясните, что именно вам нужно. Я не могу понять вашу проблему, не могли бы вы привести еще несколько примеров?
Тердон

3
На самом деле, sed - это потоковый редактор . Не для того, чтобы быть педантичным, но на самом деле он не предназначен для изменения файлов, если только эти файлы не являются потоками. Именно поэтому -iфлаг нестандартный . edдля редактирования файлов.
Кодзиро

Ответы:


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. Тем не менее, чтобы не «отменяют» ОС по умолчанию 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 может быть непрактичным или невозможным без значительных изменений кода.


Там всегда Boot Camp . :)
Кодзиро

13
По какой-то причине brew install coreutilsне входит sed. Вы можете сделать brew install gnu-sedоднако это количество установок , gsedа не sed, даже если вы обновите $PATH. Я создал символическую ссылку, чтобы скрыть Mac 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"

Кроме того, вы можете получить доступ к их man-страницам с обычными именами, каталогом "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.