แทนที่คำสั่งเชลล์ของ OS X ด้วยเวอร์ชัน linux หรือไม่


32

คำสั่งที่มีให้ตามค่าเริ่มต้นใน Terminal ใน OS X ดูเหมือนจะไม่ทำงานเหมือนกับรุ่น linux ฉันจะแทนที่ทั้งหมดด้วยคำสั่ง GNU linux จริงได้อย่างไร

ตัวอย่างเช่น sed -i ต้องการอาร์กิวเมนต์เพิ่มเติมที่น่ารำคาญ นอกจากนี้ยังใช้งานได้กับไฟล์ข้อความเท่านั้น นี่คือไร้ประโยชน์


1
อืมมม ... sed เป็น "text editor" มันสามารถแก้ไขไฟล์ไบนารี่ได้ คุณต้องการให้มันทำอะไรอีก? กรุณาอธิบายสิ่งที่คุณต้องการ ฉันไม่เข้าใจปัญหาของคุณคุณสามารถยกตัวอย่างเพิ่มเติมได้หรือไม่
terdon

3
ที่จริง sed เป็นบรรณาธิการกระแส เพื่อไม่ให้อวดรู้ แต่จริงๆแล้วมันไม่ได้หมายถึงการปรับเปลี่ยนไฟล์ยกเว้นว่าไฟล์เหล่านั้นเป็นสตรีม นั่นคือได้อย่างแม่นยำว่าทำไม-iธงที่ไม่ได้มาตรฐาน edใช้สำหรับแก้ไขไฟล์
kojiro

คำตอบ:


43

ในกรณีทั่วไปคุณไม่สามารถ (หรือไม่ควร ) แทนที่คำสั่งเริ่มต้นได้เลย เหตุผลก็คือสคริปต์การดูแลระบบจำนวนมากและแพคเกจของบุคคลที่สามอาจใช้คำสั่งเหล่านี้ในการทำงานตามที่พวกเขาทำได้นอกกรอบบน OS X

ดังนั้นหากคุณเพียงแค่ล้างคำสั่งของระบบและแทนที่ด้วย GNU เทียบเท่าที่มีพฤติกรรมที่ไม่เข้ากันหรืออาร์กิวเมนต์บรรทัดคำสั่งก็อาจจะทำลายบางสิ่งบางอย่าง โดยเฉพาะอย่างยิ่งหากคุณใช้ซอฟต์แวร์บางตัวที่ "เชื่อมต่อ" กับ Mac OS X หลังจากที่ได้รับการออกแบบมาให้ทำงานบน Linux หรือ BSD เนื่องจากโปรแกรมประเภทนี้มีแนวโน้มที่จะพึ่งพาเชลล์สคริปต์และคำสั่งระบบแทนการเรียก OS X API

สิ่งที่คุณสามารถทำได้คือติดตั้งสภาพแวดล้อมที่ติดตั้งยูทิลิตี้ GNU ในไดเรกทอรีอื่นโดยไม่เขียนทับค่าเริ่มต้นจากนั้นปรับPATHตัวแปรสภาพแวดล้อมของคุณเพื่อให้ความสำคัญกับคำสั่งที่พบในไดเรกทอรี GNU ก่อนที่จะค้นหาไดเรกทอรีระบบ คุณสามารถวางสายนี้เพื่อให้มันตั้งค่า PATH ของคุณแบบนั้นถ้าคุณเริ่มเชลล์เชิงโต้ตอบ คุณสามารถ google วิธีการทำเช่นนี้กับbashหรือถามคำถามอื่นใน SU (หรือค้นหาเพราะอาจถูกถามก่อน) หากคุณต้องการทำเช่นนั้น

ตัวอย่างของสภาพแวดล้อมเช่นHomebrewซึ่งตัวอย่างมี GNU sedเหนือสิ่งอื่นใด เมื่อคุณติดตั้ง Homebrew แล้วคุณสามารถพิมพ์

brew install coreutils

และติดตั้งGNU coreutils เหล่านี้จะช่วยให้คุณมีsed, date, printf, wcและเครื่องมืออื่น ๆ อีกมากมายที่มาพร้อมกับ GNU / Linux แต่ไม่ OS X ได้อย่างไรก็ตามเพื่อไม่ให้ "แทนที่" เริ่มต้น OS X ไบนารีที่พวกเขาจะนำหน้าด้วยgโดยปริยาย ดังนั้นหลังจากติดตั้ง Coreutils แล้วหากคุณต้องการใช้ GNU sed ให้พิมพ์

gsed

ถ้าเป็นแบบนี้มากเกินไปของการทะเลาะพิมพ์ทุกครั้งที่คุณสามารถเพิ่ม "gnubin directory" เพื่อเส้นทางของคุณและเพียงโทร GNU sed sedกับ คุณจะต้องเพิ่มสิ่งต่อไปนี้ใน~/.bash_profile:

PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"

แน่นอนถ้าคุณจำเป็นต้องมีสภาพแวดล้อมลินุกซ์จากซุปถั่ว (เคอร์เนล, X11, เข้ากันได้ syscall ฯลฯ ) คุณจะต้องใช้ Linux ในเครื่องเสมือนเช่นVirtualBox นี่เป็นเดิมพันที่ปลอดภัยถ้าคุณต้องการเรียกใช้ซอฟต์แวร์หรือสคริปต์ที่ออกแบบมาเพื่อทำงานบน Linux

Homebrew จะจ่ายให้คุณสำหรับความเข้ากันได้ของคลาสบางโปรแกรมที่ไม่ต้องการลักษณะการทำงานเฉพาะของ Linux ตัวอย่างเช่นinotifyมีเฉพาะใน Linux drm(Direct Rendering Manager) มีเฉพาะใน Linux มีการเรียกระบบระดับต่ำอื่น ๆ ที่ใช้งานได้บน Linux เท่านั้นและไม่มีการเทียบเท่าบน OS X ดังนั้นการย้ายโปรแกรมบางโปรแกรมจาก Linux ไปยัง OS X อาจไม่สามารถใช้งานได้หรือเป็นไปไม่ได้หากไม่มีการเปลี่ยนแปลงรหัสที่สำคัญ


มีเสมอBoot Camp :)
kojiro

13
สำหรับเหตุผลใดไม่รวมถึงbrew install coreutils sedคุณสามารถทำสิ่งbrew install gnu-sedนี้ได้ แต่จะติดตั้งgsedและไม่sedแม้ว่าคุณจะอัปเดต$PATHก็ตาม ฉันสร้าง symlink เพื่อซ่อน Mac sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedแต่คุณยังต้องทำman gsedเพื่อดู manpage ที่ถูกต้อง
dimo414

6
brew install gnu-sed --default-namesจะติดตั้งเป็นsed
ivotron

1
แทนที่จะ--default-namesติดตั้งคุณสามารถติดตั้งด้วยคำสั่ง g-prefix และติดตั้ง 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 page ของพวกเขาด้วยชื่อปกติ "gnuman" ไดเรกทอรีไปยัง MANPATH ของคุณจาก bashrc ของคุณเช่นกัน

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

0

ด้วยความเคารพsedคุณสามารถดาวน์โหลดไบนารีที่คอมไพล์แล้วจากRudixโครงการได้ เพิ่มเติมสำหรับRudixแพคเกจดูที่นี่และที่นี่

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