Bis zu diesem Monat waren meine Shell-Konfigurationen ziemlich einfach (nur ein .bashrc
oder .bash_profile
hauptsächlich mit einigen Aliasnamen), aber ich habe sie überarbeitet, damit ich je nach Verwendung von zsh und bash ein anderes Verhalten erhalten kann. Sie geben zuerst eine generische Shell-Konfigurationsdatei heraus, die für alles funktionieren soll, und spezialisieren sich dann auf die verwendete Shell (ich verweise darauf).
Ich war heute überrascht, als ich ls
aufhörte zu arbeiten. Es stellte sich heraus, dass es beim Refactoring .bashrc
einen Alias gab
alias ls='ls --color=always'
Das war der Grund für die ls
Bash auf dem Terminal in OSX. Als ich sah, dass BSD Farbe ls
mag -G
, GNU (oder was auch immer auf Ubuntu war) mag --color
, war klar, dass sich einige Optionen unterscheiden.
Meine Frage ist, wie können Unterschiede in den Optionen und dergleichen zwischen BSD- und GNU-Coreutils am besten berücksichtigt werden. Sollte ich in if
Blöcken nach einer env-Variablen suchen, um festzustellen, welches Betriebssystem verwendet wird, und das richtige Verhalten anwenden? Oder ist es sinnvoller, für jedes Betriebssystem separate Konfigurationsdateien zu erstellen?
Während die Antworten auf diese Fragen subjektiv sein können, scheint es ziemlich objektiv zu sein, den Umfang der Unterschiede zwischen BSD- und GNU-Coreutils und Strategien, um diese zu umgehen, um eine generische Konfiguration für die meisten * nix-Anwendungen nutzbar zu machen, zusammenzufassen.
ls -c
unterscheidet sich vonls --color
. Ihre Frage wurde bearbeitet, um sie zu beheben.Antworten:
Die einzige zuverlässige Möglichkeit, Skripte zu schreiben, die verschiedene Betriebssysteme unterstützen, besteht darin, nur Funktionen zu verwenden, die von POSIX definiert werden.
Für Dinge wie Ihre persönlichen Shell-Konfigurationen können Sie Hacks verwenden, die zu Ihrem spezifischen Anwendungsfall passen. So etwas wie das Folgende ist hässlich, wird aber das Ziel erreichen.
quelle
coreutils
explizit zu suchen , warum nicht einfach testen, ob das Farbflag funktioniert, zif ls --color=auto -d / >/dev/null 2>&1; then ...
.Das Verunreinigen des Codes mit
if
Anweisungen zum Umschalten des Coreutil- Typs funktioniert zwar. Die saubere Programmierlösung für den Umgang mit verschiedenen Typen besteht jedoch darin, Polymorphismus zu verwenden . Da dies Bash ist, haben wir keinen Polymorphismus an sich, aber ich habe herumgespielt, um ihn zu fälschen. Die einzige Voraussetzung ist, dass Ihre.bashrc
Datei usw. in Funktionen organisiert ist.Zuerst erstelle ich einen Test für den Plattformtyp coreutils :
Dann können wir basierend auf dem Typ versenden:
Hier ist die BSD- Implementierung:
(Beachten Sie, dass wir die
CLICOLOR
Variable verwenden, um Farbenalias
einzuschalten, anstatt eine zu verwenden , was ein wenig sauberer zu sein scheint.)Und die GNU- Impelementation:
Der Vollständigkeit halber hier eine Beispielimplementierung der "abstrakten Basis":
quelle
ls
in Ihrem Dispatcher zu verwenden, anstattcat
, da keiner Ihrer Aliase involviert istcat
.--color=auto
Ihren zweiten und dritten Aliase nicht benötigen , da der erste Alias diese Option hinzufügtls
.alias
das rekursiv war. Dadurch kann ich das Beispiel viel einfacher machen.Keine direkte Antwort auf Ihre Frage, aber ich habe Wrapper-Skripte, um solche Dinge zu behandeln, anstatt zusätzliche Komplikationen in der .bashrc. Zum Beispiel ist hier mein l-Skript, das Ihren Fall hier plattformübergreifend behandelt:
http://www.pixelbeat.org/scripts/l
quelle