Как заменить утилиты Mac OS X базовыми утилитами GNU?

181

Я обнаружил, что есть некоторые различия между утилитой, которую я использовал на Mac OSX и Linux. Я хочу объединить свой опыт.

Как я могу заменить все мои утилиты Mac утилитами GNU?

steveyang
источник
2
См. Также apple.stackexchange.com/questions/71119/… .
2012 года
2
Вот руководство topbug.net/blog/2013/04/14/…
Деннис
16
Я сочувствую вашим разочарованиям, но я считаю, что в долгосрочной перспективе это вызовет еще большее разочарование, если они будут заменены. После того, как я попытаюсь сделать то же самое, я бы порекомендовал использовать, homebrewкак указано ниже, а затем просто научиться использовать утилиты с g( gsed, greadlinkи т.д.) вместо замены системных утилит.
cwd
Для grep, см. Apple.stackexchange.com/questions/193288/…
Дэн Приттс
3
Я не согласен с @cwd, использование --with-default-namesтолько влияет на локального пользователя. Это может быть проблемой с Mac-ориентированными терминальными утилитами, но если вы используете homebrew для всего, вы также можете притворяться, что используете linux. Смешанный с iterm2, он отлично работает для меня, я могу притвориться, что я дома с моими linux-боксами.
Рэй Фосс

Ответы:

210

Это добавляет символические ссылки для утилит GNU с префиксом g для /usr/local/bin/:

brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep

Смотрите brew search gnuдля других пакетов. Если вы хотите использовать команды без префикса ag, добавьте, например, /usr/local/opt/coreutils/libexec/gnubinперед другими каталогами на вашем PATH.

$ brew info coreutils
coreutils: stable 8.21
http://www.gnu.org/software/coreutils
Depends on: xz
/usr/local/Cellar/coreutils/8.20 (208 files, 9.4M)
/usr/local/Cellar/coreutils/8.21 (210 files, 9.6M) *
https://github.com/mxcl/homebrew/commits/master/Library/Formula/coreutils.rb
==> Caveats
All commands have been installed with the prefix 'g'.

If you really need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:

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

Additionally, you can access their man pages with normal names if you add
the "gnuman" directory to your MANPATH from your bashrc as well:

    MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
LRI
источник
6
FWIW, у меня есть формула Homebrew, которая действует как метапакет для всех этих замечательных утилит GNU: см. shiny-and-gnu.rbВ github.com/al-the-x/homebrew-mine
AL the X
1
Первый PATH работает, но MANPATH потерпел неудачу, почему? Это потому, что я использую OSX10.10? Я повторил $ ​​MANPATH, и я получил /usr/local/opt/coreutils/libexec/gnuman:, кажется, оригинальная MANPATH не была включена. После того, как я прокомментировал конфету MANPATH в моем bashrc, я ничего не получил ecoh $MANPATH. И, конечно, если я использую man pwd, я получил руководство BSD. Как это исправить?
Дзен
2
Для findutils, вам нужно добавить PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"что не указано в выводе консоли установки.
Шридхар Сарнобат
1
Кроме того, чтобы получить нужную справочную страницу findutils, добавьте ее на свой$MANPATH /usr/local/opt/findutils/share/man
Christian Long
1
@Zen: правильный путь , чтобы начать MANPATHтаким образом , чтобы сохранить значение системы по умолчанию: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". Ключ находится в конструкции ${var-default_value}.
дан
50

Кроме того brew install coreutils, вы можете также необходимо установить другие пакеты, такие как gnu-sed, grep:

brew install findutils
brew install gnu-indent
brew install gnu-sed
brew install gnutls
brew install grep
brew install gnu-tar
brew install gawk

Обратите внимание, что эта --with-default-namesопция удалена с января 2019 года, поэтому каждый двоичный файл должен быть добавлен в путь, если они должны использоваться без gпрефикса.

Старая ссылка (когда --with-default-namesбыла доступна): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

xuhdev
источник
Обратите внимание, что brew install gawk(в отличие от всех остальных) заменит awk(через символическую ссылку /usr/local/bin/awk). Если вы хотите сохранить оригинал /usr/bin/awk, простоrm /usr/local/bin/awk
wisbucky
17

Я не уверен, что рекомендовал бы заменить их; однако вы можете установить их по другому пути и использовать их таким образом. В целом, если вы пришли из Linux и хотели бы получить доступ к более «универсальным» * утилитам nix и системе, аналогичной apt, то я бы порекомендовал заглянуть в Macports: http://www.macports.org

Это позволяет, например, использовать последний «универсальный» GCC, в отличие от / в дополнение к включенному GCC от Apple, просто в качестве примера.

Джонатан
источник
3
Например, tar и zip из Mac OS X знают о метаданных, чего нет в версиях GNU.
LHF
1
Есть поставляемые Apple приложения, которые являются всего лишь графическим интерфейсом для некоторых инструментов командной строки, и если вы замените их, приложения могут начать странно себя вести, поэтому продолжайте добавлять, а не заменять.
Ɱark Ƭ
Правильно; что-то вроде Macports добавляет их, но не заменяет их.
Джонатан
Если вы хотите использовать утилиты GNU по умолчанию с MacPorts, вы можете добавить их /opt/local/libexec/gnubinв начало своей PATHпеременной среды.
отмечается
8

Я написал сценарий, чтобы сделать именно это! Сценарий можно посмотреть здесь (или ниже). Тем не менее, я не всегда могу гарантировать, что этот пост будет отражать последнюю версию скрипта, на которую ссылались ранее.

После запуска сценария будет установлен Homebrew (если еще нет), будут установлены все связанные утилиты GNU (если еще нет), и PATHпеременная будет построена из установленных утилит.

#!/bin/bash

# Install Homebrew (if not already installed)
ruby -e "$(curl -fsSL "\
"https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Install required packages from Homebrew
brew tap homebrew/dupes
brew install coreutils binutils diffutils ed findutils gawk gnu-indent gnu-sed \
  gnu-tar gnu-which gnutls grep gzip screen watch wdiff wget bash gdb gpatch \
  m4 make nano file-formula git less openssh python rsync svn unzip vim \
  --default-names --with-default-names --with-gettext --override-system-vi \
  --override-system-vim --custom-system-icons

# Empty the .bash_path file that holds GNU paths
> ~/.bash_path

# Build PATH variable script in ~/.bash_path
for i in /usr/local/Cellar/*/*/bin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnubin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/share/man; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnuman; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done

# Check if .bash_path is being called from .bash_profile
PATCH=`grep "~/.bash_path" ~/.bash_profile`
if [ "$PATCH" == "" ]; then
  # Add Ubuntu-style PS1 to .bash_profile
  cat <<EOF > ~/.bash_profile
export PS1="\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]# "
EOF
  # Add .bash_path to .bash_profile
  echo "source ~/.bash_path" >> ~/.bash_profile
fi
Глина Фриман
источник
1
Разве вам не нравятся отрицательные отзывы без критических комментариев? Спасибо за сценарий.
Джастин Форс
@JustinForce Нет проблем! Спасибо за ваш отзыв!
Глина Фриман
2
-1. Этот сценарий делает слишком много магии. Вся эта .bash_pathошибка не нужна, если вы следуете ответам @ user495470 и @ xuhdev. И смена PS1 полностью выходит за рамки этого вопроса.
Грег Дубицки
1
@GregDubicki, к сожалению, для некоторых из этих пакетов необходим путь искажения bash. Вы можете проверить это сами. Что касается смены PS1: этот скрипт для личного пользования. Любой, кто хочет вернуть его, может сделать это очень легко.
Глина Фриман
5

Я написал скрипт, который прозрачным образом преобразует интерфейс командной строки MacOS в новый интерфейс командной строки GNU / Linux.

  • установка недостающих программ GNU
  • обновление устаревших программ GNU
  • замена предустановленных программ BSD их предпочтительной реализацией GNU
  • установка других программ, распространенных среди популярных дистрибутивов GNU / Linux

https://github.com/fabiomaia/linuxify

git clone https://github.com/fabiomaia/linuxify.git
cd linuxify/
./linuxify install

Это также позволяет вам легко отменить все.

./linuxify uninstall
fabiomaia
источник
1
Попытка выполнить первую команду ( git clone git@github.com.:fabiomaia/linuxify.git) Сначала говорилось: «Невозможно установить подлинность хоста github.com и т. Д.». Я набрал yesи нажал Enter. Тогда он сказал, git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.что не так?
Изогфиф
@izogfif Попробуйте вместо этого клонировать с HTTPSgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia
1
Да, это сработало. Пожалуйста, обновите свой ответ (также удалите эти доллары в начале - они копируются при выделении текста и копировании и вставке в консоль).
Изогфиф
@izogfif Спасибо за предложения.
Фабиомая