OS X'in kabuk komutlarını linux sürümleriyle değiştir.


32

OS X'deki Terminal'de varsayılan olarak bulunan komutlar linux sürümleri gibi görünmüyor. Hepsini gerçek GNU linux komutları ile nasıl değiştirebilirim?

Örneğin sed -i can sıkıcı bir şekilde ek "" argümanı gerektirir. Ayrıca, sadece metin dosyalarıyla çalışır. Bu işe yaramaz.


1
Umm ... sed bir "metin editörü" dür, ayrıca ikili dosyaları da değiştirebilir. Başka ne yapmasını istersin? Lütfen tam olarak neye ihtiyacınız olduğunu açıklayın. Sorunu anlayamıyorum, biraz daha örnek verebilir misin?
terdon

3
Aslında, sed bir akış düzenleyicisidir . Bilgi niteliğinde olmamak, ancak aslında bu dosyalar akış olmadıkça dosyaları değiştirmek anlamına gelmez. Tam da bu nedenle -ibayrak standart değil . eddosyaları düzenlemek içindir.
kojiro

Yanıtlar:


43

Genel durumda, varsayılan komutların hiçbirini değiştiremezsiniz (veya etmemelisiniz ). Bunun nedeni, birçok sistem yönetimi betiğinin ve üçüncü taraf paketlerinin, OS X üzerindeki kutusundan çıkardıkları gibi davranması için muhtemelen bu komutlara dayanmasıdır.

Bu nedenle, sadece sistem komutlarını silerseniz ve onları uyumsuz davranış veya komut satırı argümanlarına sahip GNU eşdeğerleriyle değiştirirseniz, muhtemelen bir şeyleri kırar. Özellikle, Linux veya BSD'de çalışacak şekilde tasarlandıktan sonra Mac OS X'e "taşınmış" bir yazılım kullanıyorsanız, bu tür programların OS X API'lerini çağırmanın aksine kabuk komut dosyalarına ve sistem komutlarına daha fazla güvenmesi daha olasıdır.

Ne yapabilirsiniz yapmak daha sonra varsayılan üzerine yazmadan başka dizinde GNU araçları yükler bir ortam yükleyin ve bir senin ayarlamak PATHortam değişkeni komutları bile sistem dizinleri arar önce GNU dizin içindeki üzere bu öncelik verir, böylece. Bunu, etkileşimli bir kabuk başlatıyorsanız PATH'inizi yalnızca bu şekilde ayarlaması için bağlayabilirsiniz; Bunu yapmak için Google’la bunun nasıl yapılacağını bashveya SU hakkında başka bir soru sorabilir (veya daha önce sorulmuş olduğundan, onu arayabilirsiniz).

Böyle bir ortamın bir örneği, örneğin başka şeylerin yanı sıra GNU olan Homebrew'tirsed . Homebrew'u yükledikten sonra yazabilirsiniz

brew install coreutils

ve GNU Coreutils'i kurun . Bunlar sağlayacaktır sed, date, printf, wcve birçok diğer araçlar şekilde değil "geçersiz kılma" varsayılan OS X binarylerine Ancak GNU / Linux, ancak OS X ile gemi, yani onlar öneki getirilecek gvarsayılan olarak. Yani, Coreutils'i kurduktan sonra, GNU sed kullanmak istiyorsanız,

gsed

Bu, her zaman yazmak için çok fazla güçlük varsa, PATH'inize bir "gnubin" dizini ekleyebilir ve GNU sed ile sadece çağırabilirsiniz sed. Aşağıdakileri kendinize eklemeniz gerekir ~/.bash_profile:

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

Tabii ki, çorbadan kuruyemişlere kadar bir Linux ortamına ihtiyacınız varsa (çekirdek, X11, sistem uyumluluğu vb.), Linux'u VirtualBox gibi bir sanal makinede çalıştırmanız gerekir . Linux'ta çalışacak şekilde tasarlanmış yazılım veya komut dosyalarını çalıştırmanız gerekirse, bu güvenli bir bahistir.

Homebrew, yalnızca Linux'a özgü davranış gerektirmeyen belirli program sınıfları için uyumluluk sağlar. Örneğin inotify, yalnızca Linux'ta kullanılabilir. drm(Doğrudan İşleme Yöneticisi) yalnızca Linux'ta kullanılabilir. Yalnızca Linux'ta kullanılabilen ve OS X'de eşdeğeri olmayan başka bir düşük seviye sistem çağrısı vardır, bu nedenle belirli programları Linux'tan OS X'e taşımak, önemli kod değişiklikleri olmadan pratik veya imkansız olabilir.


Her zaman Boot Camp var . :)
kojiro

13
Hangi nedenle olursa olsun brew install coreutilsiçermez sed. Sen yapabilirsin brew install gnu-sedbu yüklemelerini ancak gseddeğil sedGüncellemenizi bile $PATH. Mac'leri gizlemek için bir sembolik bağlantı oluşturdum sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedancak yine de man gseddoğru sayfayı görmek için yapmanız gerekenler .
dimo414

6
brew install gnu-sed --default-namesolarak yükleyecektirsed
ivotron

1
Bunun yerine --default-names, g önekli komutlarla kurulum yapabilir ve daha sonra oh-my-zsh (şiddetle tavsiye edilir) kurabilir ve eklenti gnu-utils'ini etkinleştirebilirsiniz.
bibstha

3

OS X'i destekleyen bir Gentoo Öneki kullanabilirsiniz , bunu önyükleme yaparak ve önek dizinindeki ilgili yolları PATH'inize ekleyerek yapabilirsiniz. Bu zaten sizin için yapıyor olabilir. Bunu yaptıktan sonra paketleri kurmak için standart Gentoo komutlarını kullanabilirsiniz.

emerge coreutils Örneğin, standart GNU yardımcı programlarını alır.

Gentoo'nun varsayılan olarak derlendiğini, bunun yerine ikili bir ana bilgisayar kurmak isteyebileceğinizi lütfen unutmayın . Bu sadece bu makalenin ikinci yarısında URL'lerin birini kullanarak ve yerleştirerek olduğu PORTAGE_BINHOST="... your url here ..."içinde ./etc/make.confsenin Önekteki.


1

@ Allquixotic'nin gönderisine göre, işte resmi talimatlar: brew install coreutils

Tüm komutlar 'g' ön ekiyle kuruldu.

Bu komutları gerçekten normal adlarıyla kullanmanız gerekiyorsa, PATH'nize bashrc dizininizden bir "gnubin" dizini ekleyebilirsiniz.

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

Ayrıca, man sayfalarına normal isimlerle "gnuman" dizinini MANPATH'nize bashrc adresinden de erişebilirsiniz.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.