Ganti perintah shell OS X dengan versi linux?

32

Perintah yang tersedia secara default di Terminal di OS X, sepertinya tidak berperilaku seperti versi linux mereka. Bagaimana saya bisa mengganti semuanya dengan perintah linux GNU yang sebenarnya?

Sebagai contoh, saya membutuhkan argumen tambahan yang "" mengganggu. Juga, ini hanya bekerja dengan file teks. Ini tidak berguna.

Yang satu
sumber
1
Umm ... sed adalah "editor teks", itu juga dapat memodifikasi file biner. Apa lagi yang ingin Anda lakukan? Tolong jelaskan apa yang sebenarnya Anda butuhkan. Saya tidak dapat memahami masalah Anda, dapatkah Anda memberikan beberapa contoh lagi?
terdon
3
Sebenarnya, sed adalah editor aliran . Tidak terlalu bertele-tele, tetapi sebenarnya tidak dimaksudkan untuk memodifikasi file, kecuali file-file tersebut adalah stream. Itulah sebabnya -ibendera tidak standar . edadalah untuk mengedit file.
kojiro

Jawaban:

43

Dalam kasus umum, Anda tidak dapat (atau tidak seharusnya ) mengganti perintah default sama sekali. Alasannya adalah bahwa banyak skrip administrasi sistem dan paket pihak ketiga mungkin mengandalkan perintah ini untuk berperilaku seperti yang mereka lakukan di luar kotak pada OS X.

Jadi, jika Anda hanya menghapus perintah sistem dan menggantinya dengan setara GNU yang memiliki perilaku yang tidak kompatibel atau argumen baris perintah, itu mungkin akan merusak sesuatu. Terutama jika Anda menggunakan beberapa perangkat lunak yang "porting" ke Mac OS X setelah awalnya dirancang untuk berjalan di Linux atau BSD, karena jenis program ini lebih cenderung bergantung pada skrip shell dan perintah sistem daripada memanggil OS X API.

Yang dapat Anda lakukan adalah menginstal lingkungan yang menginstal utilitas GNU di direktori lain tanpa menimpa default, dan kemudian menyesuaikan PATHvariabel lingkungan Anda sehingga memberikan prioritas pada perintah yang ditemukan dalam direktori GNU sebelum bahkan mencari direktori sistem. Anda bisa memasang ini sehingga hanya mengatur PATH Anda seperti itu jika Anda memulai shell interaktif; Anda dapat google cara melakukan ini dengan bashatau mengajukan pertanyaan lain pada SU (atau mencarinya, karena mungkin pernah ditanyakan sebelumnya) jika Anda ingin melakukannya.

Contoh dari lingkungan semacam itu adalah Homebrew yang misalnya memiliki GNU sed. Setelah menginstal Homebrew, Anda dapat mengetik

brew install coreutils

dan instal GNU Coreutils . Ini akan memberikan Anda dengan sed, date, printf, wcdan banyak alat lainnya yang kapal dengan GNU / Linux, tapi tidak OS X. Namun, agar tidak "override" default OS X binari, mereka akan diawali dengan gsecara default. Jadi, setelah menginstal Coreutils, jika Anda ingin menggunakan GNU, ketikkan

gsed

Jika ini terlalu merepotkan untuk diketik setiap saat, Anda dapat menambahkan direktori "gnubin" ke PATH Anda dan cukup panggil GNU dengan sed. Anda harus menambahkan yang berikut ini ke ~/.bash_profile:

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

Tentu saja, jika Anda memerlukan lingkungan Linux dari sup ke kacang (kernel, X11, kompatibilitas syscall, dll) Anda harus menjalankan Linux di mesin virtual, seperti VirtualBox . Ini adalah taruhan yang aman jika Anda perlu menjalankan perangkat lunak atau skrip yang dirancang untuk berjalan di Linux.

Homebrew hanya akan memberi Anda kompatibilitas untuk kelas program tertentu yang tidak memerlukan perilaku spesifik Linux. Misalnya inotifyhanya tersedia di Linux. drm(Direct Rendering Manager) hanya tersedia di Linux. Ada beberapa panggilan sistem tingkat rendah yang hanya tersedia di Linux, dan yang tidak ada padanannya pada OS X, jadi memindahkan program-program tertentu dari Linux ke OS X dapat menjadi tidak praktis atau tidak mungkin tanpa perubahan kode yang signifikan.

allquixotic
sumber
Selalu ada Boot Camp . :)
kojiro
13
Untuk alasan apa pun brew install coreutilstidak termasuk sed. Namun Anda dapat melakukan brew install gnu-sedini menginstal gseddan tidak sed, bahkan jika Anda memperbarui $PATH. Saya membuat symlink untuk menyembunyikan Mac sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sednamun Anda masih harus melakukan man gseduntuk melihat halaman manual yang tepat.
dimo414
6
brew install gnu-sed --default-namesakan menginstalnya sebagaised
ivotron
1
Alih-alih --default-names, Anda dapat menginstal dengan perintah g-prefixed dan kemudian menginstal oh-my-zsh (sangat disarankan) dan mengaktifkan plugin gnu-utils.
bibstha
3

Anda dapat menggunakan Gentoo Prefix yang mendukung OS X, Anda dapat melakukannya dengan bootstrap dan kemudian menambahkan path yang relevan di direktori awalan ke PATH Anda. Mungkin ini sudah melakukan itu untuk Anda. Setelah selesai, Anda dapat menggunakan perintah standar Gentoo untuk menginstal paket.

emerge coreutils akan memberi Anda utilitas GNU standar, misalnya.

Harap dicatat bahwa Gentoo mengkompilasi secara default, Anda mungkin ingin mengatur host biner . Ini hanya menggunakan salah satu URL pada bagian kedua artikel itu, dan menempatkannya PORTAGE_BINHOST="... your url here ..."di ./etc/make.confdalam awalan Anda.

Tamara Wijsman
sumber
1

Sebagai tindak lanjut dari posting @ allquixotic, berikut adalah instruksi resmi per brew install coreutils

Semua perintah telah diinstal dengan awalan 'g'.

Jika Anda benar-benar perlu menggunakan perintah-perintah ini dengan nama normal mereka dapat menambahkan direktori "gnubin" ke PATH Anda dari bashrc seperti

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

Selain itu, Anda dapat mengakses halaman manual mereka dengan nama normal direktori "gnuman" ke MANPATH Anda dari bashrc Anda juga

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

Sehubungan dengan sedAnda dapat mengunduh biner yang telah dikompilasi dari Rudixproyek. Untuk Rudixpaket lebih lanjut lihat di sini dan di sini .

Kerny
sumber