Hingga bulan ini, konfigurasi shell saya cukup sederhana (hanya dengan .bashrc
atau .bash_profile
sebagian alias), tetapi saya telah refactoring sehingga saya bisa mendapatkan perilaku yang berbeda tergantung pada apakah saya menggunakan zsh, dan bash. Mereka pertama-tama sumber file konfigurasi shell generik yang harus bekerja untuk apa pun, kemudian mengkhususkan diri untuk shell tertentu yang digunakan (saya simet ke ini)
Saya terkejut hari ini ketika ls
berhenti bekerja. Ternyata selama refactoring .bashrc
, ada alias
alias ls='ls --color=always'
itu melanggar hal-hal untuk ls
di bash di Terminal di OSX. Setelah saya melihat BSD ls
suka -G
warna, tetapi GNU (atau apa pun yang ada di Ubuntu) suka --color
, jelas bahwa beberapa opsi berbeda.
Pertanyaan saya adalah, apa cara terbaik untuk menjelaskan perbedaan pilihan dan antara BSD dan GNU coreutils? Haruskah saya menguji variabel env dalam if
blok untuk melihat OS apa yang digunakan dan menerapkan perilaku yang benar? Atau apakah lebih masuk akal untuk membuat file konfigurasi terpisah untuk setiap OS?
Sementara jawaban untuk pertanyaan-pertanyaan ini mungkin subyektif, sepertinya ikhtisar dari lingkup perbedaan antara BSD dan GNU coreutils dan strategi untuk mengatasi ini untuk membuat konfigurasi generik yang dapat digunakan pada sebagian besar * nix akan cukup objektif.
ls -c
berbeda darils --color
. Edit pertanyaan Anda untuk diperbaiki.Jawaban:
Satu-satunya cara yang dapat diandalkan untuk menulis skrip yang mendukung sistem operasi yang berbeda adalah dengan hanya menggunakan fitur yang ditentukan oleh POSIX.
Untuk hal-hal seperti konfigurasi shell pribadi Anda, Anda dapat menggunakan peretasan yang sesuai dengan kasus penggunaan spesifik Anda. Sesuatu seperti yang berikut ini jelek, tetapi akan mencapai tujuannya.
sumber
coreutils
secara eksplisit, mengapa tidak hanya menguji apakah flag warna berfungsi, misalnyaif ls --color=auto -d / >/dev/null 2>&1; then ...
.Mengotori kode dengan
if
pernyataan untuk melakukan pergantian pada tipe coreutils tidak berfungsi, namun solusi pemrograman bersih untuk menangani berbagai jenis adalah dengan menggunakan polimorfisme . Karena ini Bash, kami tidak memiliki polimorfisme sendiri, tetapi saya telah mengacaukan cara untuk memalsukannya. Satu-satunya persyaratan adalah bahwa.bashrc
file Anda dll. Diatur dalam fungsi.Pertama saya membuat tes untuk jenis platform coreutils :
Kemudian kita dapat mengirim berdasarkan tipe:
Inilah implementasi BSD :
(Perhatikan bahwa kami menggunakan
CLICOLOR
variabel untuk mengaktifkan warna alih-alih menggunakanalias
, yang tampaknya lebih bersih sedikit)Dan implementasi GNU :
Demi kelengkapan, berikut adalah contoh implementasi dari "basis abstrak":
sumber
ls
di operator Anda daripadacat
, terutama karena tidak ada alias Anda yang terlibatcat
.--color=auto
menggunakan alias kedua dan ketiga Anda, karena alias pertama menambahkan opsi ituls
.alias
itu bersifat rekursif. Itu membuat saya membuat contoh lebih sederhana.Bukan jawaban langsung untuk pertanyaan Anda, tetapi saya memiliki skrip pembungkus untuk menangani hal-hal seperti ini daripada kerumitan tambahan dalam .bashrc.
http://www.pixelbeat.org/scripts/l
sumber