Як замінити утиліти Mac OS X на основні утиліти GNU?


179

Я виявив, що між командою утиліти, яку я використовував у Mac OSX та Linux, є деякі відмінності. Я хочу зробити свій досвід об'єднаним.

Як я можу замінити всі мої утиліти Mac на утиліти GNU?


2
Дивіться також apple.stackexchange.com/questions/71119/… .
lhf

2
Ось довідник topbug.net/blog/2013/04/14/…
Денніс

16
Я співчуваю вашим розчаруванням, але я вважаю, що в довгостроковій перспективі це призведе до більших розладів, якщо вони будуть замінені - Після прагнення зробити те саме, я рекомендую використовувати, homebrewяк було зазначено нижче, а потім просто навчитися користуватися утилітами з a g( gsed, greadlinkтощо) замість заміни утиліти системи.
cwd


3
Я не згоден з @cwd, використання --with-default-namesцього впливу впливає лише на місцевого користувача. Це може бути проблемою з утилітами, орієнтованими на mac, але якщо ви використовуєте homebrew для всього, ви можете також зробити вигляд, що використовуєте Linux. Змішаний з iterm2, він чудово працює для мене, я в основному можу зробити вигляд, що я вдома зі своїми linux коробками.
Рей Фосс

Відповіді:


209

Це додає посилання на утиліти 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"

6
FWIW, у мене формула Homebrew, яка діє як мета-пакет для всіх цих чудових утиліт GNU: дивіться shiny-and-gnu.rbу github.com/al-the-x/homebrew-mine
AL X

1
Перший PATH працює, але MANPATH провалився, чому? Це тому, що я використовую OSX10.10? Я відлунював $ MANPATH, і я отримав /usr/local/opt/coreutils/libexec/gnuman:, схоже, оригінальний MANPATH не включав. Після того, як прокоментував конфіденційну програму MANPATH в моєму башерці, я нічого не отримав 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
Крістіан Лонг

1
@Zen: правильний шлях , щоб почати MANPATHтаким чином , щоб зберегти значення системи по замовчуванням: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". Ключ - у конструкції ${var-default_value}.
дан

49

Крім того 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/


Зауважте, що brew install gawk(на відміну від усіх інших) замінить awk(через символічне посилання /usr/local/bin/awk). Якщо ви хочете зберегти оригінал /usr/bin/awk, простоrm /usr/local/bin/awk
wisbucky

16

Я не впевнений, що рекомендував би їх замінити ; однак ви можете встановити їх на інший шлях і використовувати їх таким чином. Загалом, якщо ви приїжджаєте з 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змінної вашого середовища.
markhep

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, усі -ingling насправді не потрібні. І зміна PS1 повністю виходить за рамки цього питання.
Грег Дубицький

1
@GregDubicki, на жаль, для деяких із цих пакетів потрібен шлях "basgling". Ви можете перевірити це на собі. Що стосується зміни PS1: цей сценарій призначений для особистого використання. Кожен, хто хоче повернути це, може зробити це дуже легко.
Клей Фрімен

5

Я написав сценарій, який прозоро перетворює CLI macOS у свіжий досвід роботи з GNU / Linux CLI

  • встановлення відсутніх програм 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

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

@izogfif Спробуйте клонувати натомість HTTPSgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia

1
Так, це спрацювало. Будь ласка, оновіть свою відповідь (також видаліть ці долари на початку - вони копіюються під час вибору тексту та копіюють в консоль).
izogfif

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