Bagaimana cara mengganti utilitas Mac OS X dengan utilitas inti GNU?

181

Saya menemukan ada beberapa perbedaan antara perintah utilitas yang saya gunakan di mac OSX dan linux. Saya ingin membuat pengalaman saya bersatu.

Bagaimana saya bisa mengganti semua utilitas mac saya dengan utilitas GNU?

steveyang
sumber
2
Berikut panduan topbug.net/blog/2013/04/14/…
Dennis
16
Saya bersimpati dengan frustrasi Anda tetapi saya percaya bahwa, dalam jangka panjang, itu akan menyebabkan frustrasi yang lebih besar jika diganti - Setelah berusaha melakukan hal yang sama saya sarankan menggunakan homebrewseperti yang disebutkan di bawah ini, dan kemudian hanya belajar menggunakan utilitas dengan a g( gsed,, greadlinkdll) alih-alih mengganti utilitas sistem.
cwd
Untuk grep, lihat apple.stackexchange.com/questions/193288/…
Dan Pritts
3
Saya tidak setuju dengan @cwd, menggunakan --with-default-nameshanya memengaruhi pengguna lokal. Ini bisa menjadi masalah dengan utilitas terminal berorientasi mac, tetapi jika Anda menggunakan homebrew untuk semuanya, Anda mungkin juga berpura-pura menggunakan linux. Dicampur dengan iterm2, ini bekerja dengan baik untuk saya, pada dasarnya saya bisa berpura-pura pulang dengan kotak linux saya.
Ray Foss

Jawaban:

210

Ini menambahkan symlink untuk utilitas GNU dengan awalan g ke /usr/local/bin/:

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

Lihat brew search gnupaket lain. Jika Anda ingin menggunakan perintah tanpa awalan ag tambahkan misalnya /usr/local/opt/coreutils/libexec/gnubinsebelum direktori lain di Anda 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
sumber
6
FWIW, saya memiliki Formula Homebrew yang bertindak sebagai meta-paket untuk semua utiliti GNU yang hebat: lihat shiny-and-gnu.rbdi github.com/al-the-x/homebrew-mine
AL the X
1
PATH pertama berfungsi, tetapi MANPATH gagal, mengapa? Apakah karena saya menggunakan OSX10.10? Saya menggemakan $ MANPATH, dan saya mengerti /usr/local/opt/coreutils/libexec/gnuman:, sepertinya MANPATH asli tidak termasuk. Setelah mengomentari conf MANPATH di bashrc saya, saya tidak mendapatkan apa-apa ecoh $MANPATH. Dan tentu saja, jika saya gunakan man pwd, saya mendapat manual BSD. Bagaimana cara memperbaikinya?
Zen
2
Sebab findutils, Anda perlu menambahkan PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"yang tidak disebutkan dalam output konsol instalasi.
Sridhar Sarnobat
1
Selain itu, untuk mendapatkan halaman manual yang tepat findutils, tambahkan ini ke Anda$MANPATH /usr/local/opt/findutils/share/man
Christian Long
1
@Zen: cara yang tepat untuk memulai MANPATHsehingga tetap nilai default sistem: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". Kuncinya ada di konstruk ${var-default_value}.
dan
50

Selain itu brew install coreutils, Anda juga mungkin perlu menginstal beberapa paket lainnya, seperti 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

Perhatikan bahwa --with-default-namesopsi ini dihapus sejak Januari 2019, sehingga setiap biner harus ditambahkan ke path jika ingin digunakan tanpa gawalan.

Referensi lama (kapan --with-default-namestersedia): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

xuhdev
sumber
Perhatikan bahwa brew install gawk(tidak seperti yang lainnya) akan mengganti awk(melalui tautan simbolik /usr/local/bin/awk). Jika Anda ingin menyimpan yang asli /usr/bin/awk, cukuprm /usr/local/bin/awk
wisbucky
17

Saya tidak yakin bahwa saya akan merekomendasikan untuk menggantinya ; namun, Anda dapat menginstalnya ke jalur yang berbeda dan menggunakannya dengan cara itu. Secara keseluruhan, jika Anda berasal dari Linux dan ingin mengakses lebih banyak utilitas "generik" * nix, dan sistem yang mirip dengan apt, maka saya akan merekomendasikan melihat ke dalam Macports: http://www.macports.org

Ini memungkinkan, misalnya, menggunakan GCC "generik" terbaru, sebagai lawan dari / selain GCC yang disertakan oleh Apple, seperti contohnya.

Jonathan
sumber
3
Misalnya, tar dan zip dari Mac OS X tahu tentang metadata yang tidak dimiliki versi GNU.
lhf
1
Ada aplikasi yang disediakan Apple, yang hanya GUI untuk beberapa alat baris perintah dan jika Anda menggantinya aplikasi mungkin mulai berperilaku aneh, jadi lanjutkan dengan menambahkan, bukan mengganti.
Ɱark Ƭ
Baik; sesuatu seperti Macports menambahkannya, itu tidak menggantikannya.
Jonathan
Jika Anda ingin menggunakan utilitas GNU secara default dengan MacPorts Anda dapat menambahkan /opt/local/libexec/gnubinke depan PATHvariabel lingkungan Anda .
markshep
8

Saya sudah menulis skrip untuk melakukan ini! Script dapat dilihat di sini (atau di bawah). Namun, saya tidak dapat selalu menjamin posting ini akan mencerminkan versi terbaru dari skrip yang ditautkan sebelumnya.

Setelah menjalankan skrip, Homebrew akan diinstal (jika belum), semua utilitas GNU yang terkait akan diinstal (jika belum), dan PATHvariabel akan dibangun dari utilitas yang diinstal.

#!/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
Clay Freeman
sumber
1
Apakah Anda tidak suka downvotes tanpa komentar kritis? Terima kasih untuk skripnya.
Justin Force
@JustinForce Tidak masalah! Terima kasih atas masukannya.
Clay Freeman
2
-1. Skrip ini melakukan terlalu banyak keajaiban. Semua .bash_path-mangling tidak benar-benar diperlukan jika Anda mengikuti jawaban @ user495470 dan @ xuhdev. Dan mengubah PS1 benar-benar di luar cakupan pertanyaan ini.
Greg Dubicki
1
@GregDubicki sayangnya, bash path "mangling" diperlukan untuk beberapa paket ini. Anda bisa memeriksanya sendiri. Sehubungan dengan mengubah PS1: skrip ini adalah untuk penggunaan pribadi. Siapa pun yang ingin mengembalikannya dapat melakukannya dengan sangat mudah.
Clay Freeman
5

Saya telah menulis sebuah skrip yang secara transparan mengubah macOS CLI menjadi pengalaman baru GNU / Linux CLI

  • menginstal program GNU yang hilang
  • memperbarui program GNU yang ketinggalan zaman
  • mengganti program BSD yang sudah diinstal sebelumnya dengan implementasi GNU pilihan mereka
  • menginstal program lain yang umum di antara distribusi GNU / Linux populer

https://github.com/fabiomaia/linuxify

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

Ini juga memungkinkan Anda untuk dengan mudah membatalkan semuanya.

./linuxify uninstall
fabiomaia
sumber
1
Mencoba menjalankan perintah pertama ( git clone [email protected].:fabiomaia/linuxify.git) Pertama-tama dikatakan "Keaslian host 'github.com' tidak dapat dibuat dll.". Saya mengetik yesdan menekan Enter. Lalu dikatakan [email protected]: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.Apa yang salah?
izogfif
@izogfif Coba kloning dengan HTTPS sebagai gantinyagit clone https://github.com/fabiomaia/linuxify.git
fabiomaia
1
Ya, itu berhasil. Tolong, perbarui jawaban Anda (juga, hilangkan dolar itu di awal - mereka disalin ketika memilih teks dan salin-tempel ke konsol).
izogfif
@izogfif Terima kasih atas sarannya.
fabiomaia