จะแทนที่ยูทิลิตี Mac OS X ด้วยยูทิลิตี้หลักของ GNU ได้อย่างไร


180

ฉันพบว่ามีความแตกต่างบางอย่างระหว่างคำสั่งยูทิลิตี้ที่ฉันใช้กับ mac OSX และ linux ฉันต้องการทำให้ประสบการณ์ของฉันเป็นหนึ่งเดียวกัน

ฉันจะแทนที่ยูทิลิตี้ mac ทั้งหมดของฉันด้วยยูทิลิตี้ GNU ได้อย่างไร


2
ดูเพิ่มเติมapple.stackexchange.com/questions/71119/...
lhf

2
นี่คือคู่มือtopbug.net/blog/2013/04/14/…
Dennis

16
ฉันเห็นด้วยกับความผิดหวังของคุณ แต่ฉันเชื่อว่าในระยะยาวมันจะทำให้เกิดความยุ่งยากมากขึ้นถ้าพวกเขาถูกแทนที่ - หลังจากพยายามทำสิ่งเดียวกับที่ฉันแนะนำให้ใช้homebrewตามที่ระบุไว้ด้านล่างแล้วเพียงแค่เรียนรู้การใช้สาธารณูปโภคด้วย a g( gsed,, greadlinkฯลฯ ) แทนการเปลี่ยนยูทิลิตีของระบบ
cwd


3
ฉันไม่เห็นด้วยกับ @cwd การใช้--with-default-namesจะมีผลกับผู้ใช้ภายในเท่านั้น มันอาจเป็นปัญหากับยูทิลิตี้เทอร์มินัลที่เน้น mac แต่ถ้าคุณใช้ homebrew สำหรับทุกสิ่งคุณอาจแกล้งทำเป็นว่าคุณกำลังใช้ linux ผสมกับ iterm2 มันใช้งานได้ดีสำหรับฉันโดยทั่วไปฉันสามารถทำเป็นว่าฉันอยู่บ้านพร้อมกล่องลินุกซ์
เรย์ฟอสส์

คำตอบ:


210

สิ่งนี้จะเพิ่ม symlink สำหรับโปรแกรมอรรถประโยชน์ 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 the X

1
PATH แรกใช้งานได้ แต่ MANPATH ล้มเหลวเพราะอะไร เป็นเพราะฉันใช้ OSX10.10 หรือไม่ ฉันสะท้อน $ MANPATH และได้รับ/usr/local/opt/coreutils/libexec/gnuman:ดูเหมือนว่า MANPATH ดั้งเดิมจะไม่รวมอยู่ด้วย หลังจากที่คอมเม้นท์ MANPATH ให้ความเห็นใน bashrc ของฉันแล้วฉันก็ไม่ได้อะไรecoh $MANPATHเลย และแน่นอนถ้าฉันใช้man pwdฉันได้รับคู่มือ BSD จะแก้ไขได้อย่างไร?
Zen

2
สำหรับfindutilsคุณต้องเพิ่มPATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"ซึ่งไม่ได้ระบุไว้ในเอาต์พุตคอนโซลการติดตั้ง
Sridhar Sarnobat

1
นอกจากนี้เพื่อให้ได้หน้าคนที่เหมาะสมให้findutilsเพิ่มสิ่งนี้ใน$MANPATH /usr/local/opt/findutils/share/man
Long Christian

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/


โปรดทราบว่าbrew install gawk(ไม่เหมือนคนอื่น ๆ ทั้งหมด) จะแทนที่awk(ผ่านลิงก์สัญลักษณ์/usr/local/bin/awk) หากคุณต้องการที่จะเก็บเดิม/usr/bin/awkเพียงrm /usr/local/bin/awk
wisbucky

17

ฉันไม่แน่ใจว่าฉันอยากจะแนะนำให้เปลี่ยนพวกเขา; อย่างไรก็ตามคุณสามารถติดตั้งลงในพา ธ อื่นและใช้วิธีนั้นได้ โดยรวมแล้วถ้าคุณมาจาก Linux และต้องการเข้าถึงยูทิลิตี้ทั่วไป "ทั่วไป" * และระบบที่คล้ายกับฉลาดดังนั้นฉันขอแนะนำให้ดู Macports: http://www.macports.org

ตัวอย่างเช่นอนุญาตให้ใช้ GCC "ทั่วไป" ล่าสุดซึ่งตรงข้ามกับ / นอกเหนือจาก GCC ที่รวมอยู่ใน Apple เช่นเดียวกับตัวอย่าง


3
ตัวอย่างเช่น tar และ zip จาก Mac OS X รู้เกี่ยวกับข้อมูลเมตาที่รุ่น GNU ไม่ทำ
lhf

1
มีแอพที่จัดหาโดย Apple ซึ่งเป็นเพียง GUI สำหรับเครื่องมือบรรทัดคำสั่งบางส่วนและหากคุณแทนที่แอพเหล่านั้นแอปอาจเริ่มทำงานอย่างแปลกประหลาดดังนั้นไปกับการเพิ่มไม่ใช่การแทนที่
ⱮarkƬ

ขวา; บางอย่างเช่น Macports จะเพิ่มพวกเขามันไม่ได้แทนที่
Jonathan

หากคุณต้องการใช้ยูทิลิตี้ GNU โดยค่าเริ่มต้นด้วย MacPort คุณสามารถเพิ่ม/opt/local/libexec/gnubinไว้ที่ด้านหน้าของPATHตัวแปรสภาพแวดล้อมของคุณ
markshep

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
คุณไม่เพียงรัก downvotes โดยไม่มีความคิดเห็นที่สำคัญใช่ไหม ขอบคุณสำหรับสคริปต์
Justin Force

@JustinForce ไม่มีปัญหา! ขอบคุณสำหรับข้อเสนอแนะ
Clay Freeman

2
-1 สคริปต์นี้ใช้เวทย์มนตร์มากเกินไป ทั้งหมดของ.bash_path-mangling ไม่จำเป็นจริงๆถ้าคุณทำตามคำตอบ @ user495470 และ @ xuhdev ของ และการเปลี่ยนแปลง PS1 นั้นไม่ได้อยู่ในขอบเขตของคำถามนี้
Greg Dubicki

1
@GregDubicki น่าเสียดายที่ bash path "mangling" นั้นจำเป็นสำหรับบางแพ็คเกจ คุณสามารถตรวจสอบได้ด้วยตัวเอง เกี่ยวกับการเปลี่ยนแปลง PS1: สคริปต์นี้มีไว้สำหรับการใช้งานส่วนตัว ใครก็ตามที่ต้องการเปลี่ยนกลับอาจทำได้ง่ายมาก
Clay Freeman

5

ฉันได้เขียนสคริปต์ที่แปลง macOS CLI ให้กลายเป็นประสบการณ์ 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 ลองโคลนด้วย HTTPS แทนgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia

1
ใช่มันใช้ได้ผล โปรดอัปเดตคำตอบของคุณ (เช่นลบดอลลาร์เหล่านั้นในตอนเริ่มต้น - พวกเขาจะถูกคัดลอกเมื่อเลือกข้อความและคัดลอกวางลงในคอนโซล)
izogfif

@izogfif ขอบคุณสำหรับคำแนะนำ
fabiomaia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.