Wie stellen Sie fest, ob Sie sich in einem Skript in einem Linux- oder BSD-System befinden?

1686
Mikey T.K.

Ich habe eine ziemlich umfangreiche Auswahl an Dotfiles, die am längsten in einem Git-Repo aufbewahrt werden - ich unterhalte lediglich einen separaten Zweig für bsd-isms (z. B. unter Linux, um farbige Ls-Ausgaben zu erhalten, die Sie ls --color=autoaber machen auf BSD-Likes, einschließlich Mac OS, ist es ls -g).

Dies wurde langsam unhandlich, seit ich die Änderung vornehmen muss, dann die Zweige zusammenführen und mit der Konfliktlösung umgehen muss, wenn ich die rc-Datei meiner Shell berühre. Der richtige Weg, um damit umzugehen, wäre das Ablegen der Git-Verzweigung, und meine rc-Datei muss feststellen, welche Art von Betriebssystem aktiviert ist, und dann ein entsprechendes Addon-Skript für die Aliase erstellen.

Das Problem ist, ich habe keine Ahnung, wie ich das machen soll.

Wie kann ich feststellen, ob ich unter Linux oder BSD in einem Skript oder einer Shell-RC-Datei bin?

unamefunktioniert nicht wirklich, seitdem muss ich eine Reihe von Logik für die verschiedenen Arten von Systemen da draußen schreiben. Mac sagt Darwin, FreeBSD usw., wenn ich mich mehr für die zugrunde liegende Art von Betriebssystem interessiere, da dies Auswirkungen darauf hat, mit welchen speziellen Werkzeugen ich mich beschäftige. Benutze ich für mein Beispiel oben bsd lsoder GNU ls?

6
ist "uname -o" nicht genug? ps: Osx hat Darwin-Wurzeln. Lorenzo Von Matterhorn vor 11 Jahren 0
Haben Sie [diese Antwort auf Stack Overflow] (http://stackoverflow.com/a/394247/2001600) gesehen? Es sieht genau so aus, was Sie suchen. John Bensin vor 11 Jahren 2
-o ist eine illegale Option für `uname`, die mit Mac OS geliefert wird. Sehen Sie, warum das so ein Problem ist. ;) Mikey T.K. vor 11 Jahren 1
@JohnBensin Das reicht! Könnten Sie das zu einer Antwort machen, damit die entsprechenden Punkte vergeben werden? Mikey T.K. vor 11 Jahren 0
Da die Frage hier immer noch zum Thema ist, schadet es nicht, dass sie bleibt. Aber wenn jemand etwas von dieser SO-Antwort zitieren möchte, müssen Sie einen Link herstellen und den Autor der Antwort erwähnen. Und Sie müssen wahrscheinlich nicht die ganze Antwort zitieren random vor 11 Jahren 1
Was mich betrifft, verknüpfe ich sie nicht mit einer neuen Antwort und nehme Punkte aus der Arbeit eines anderen. solange es als Kommentar hinzugefügt wird, ist es in Ordnung für mich. @ Random Danke für die ausführliche Erklärung, wie man reagieren soll. Lorenzo Von Matterhorn vor 11 Jahren 1
@ LorenzoVonMatterhorn Ich habe es als CW-Antwort hinzugefügt. Es ist nicht garantiert, dass Kommentare vorhanden sind, da sie auf SE-Standorten Bürger der zweiten Klasse sind. Da Links zu anderen SE-Sites nicht in der Seitenleiste "Verwandte" oder "Verknüpfte Seiten" angezeigt werden, ist ein Link, der in einem Kommentarthread eingebettet ist, nicht unbedingt für zukünftige Besucher leicht zu finden, insbesondere wenn sie nicht mit SE-Sites vertraut sind. Die Frage sieht nur unbeantwortet aus. John Bensin vor 11 Jahren 2

2 Antworten auf die Frage

10
John Bensin

Diese Stack Overflow-Antwort von Nicolas Martyanoff bietet eine Komplettlösung. Ich habe es angepasst, um die neuere Syntax zu verwenden, die in den Kommentaren erwähnt wird.

Bestimmen Sie das Betriebssystem:

platform='unknown' unamestr=$(uname) if [ "$unamestr" = 'Linux' ]; then platform='linux' elif [ "$unamestr" = 'FreeBSD' ]; then platform='freebsd' fi 

Wähle die richtigen Flaggen für ls:

if [ "$platform" = 'linux' ]; then  alias ls='ls --color=auto'  elif [ "$platform" = 'freebsd' ]; then  alias ls='ls -G'  fi 
0
Andrei Neculau

Abgesehen von der Plattformerkennung (korrekt durchgeführt über uname) müssen nicht nur die Flags korrekt ausgewählt werden, sondern auch der Pfad zur ausführbaren Datei.

Aufruf ls -Gbedeutet nur, dass Sie mir einen Alias ​​/ function / executable -in-$ PATH geben und ihn mit dem Flag ausführen -G. Dieser Alias, die Funktion oder die ausführbare Datei kann auf einem BDS-Betriebssystem BSD sein oder nicht, kann BDS-Argumenten folgen oder nicht, könnte die genaue Version, die Sie erwarten, sein oder auch nicht, usw.

Aus diesem Grunde würde man den vollständigen Pfad zum integrierten in ausführbaren verwenden, das eine wirklich hohe Chance hat (Geige mit Systemebene ist nicht so häufig wie mit Aliasnamen / Funktionen / $ PATH Hantieren) Nach Ausführung der OS: /bin/ls -G.