Update/Antwort

Update/Antwort

Okay, also ich bin hier irgendwie ratlos.

Ich bin gerade dabei, mich intensiv mit BASH zu beschäftigen, um einige Automatisierungsskripte für meinen Arbeitgeber zu schreiben. Und hier eine vollständige Offenlegung: Ich bin ein Web-Typ; bisher kannte ich GERADE genug CLI, um Git zu bedienen.

Mein Problem ist,Etwa die Hälfte der Mitarbeiter verwendet MacOS, die andere Hälfte verwendet GitBash, und es scheint, dass verschiedene Flags unterstützt werden (oder, was noch relevanter ist,nichtunterstützt) auf den beiden verschiedenen BASH-Instanziierungen. Ein weiteres Rätsel: Da alle von zu Hause aus arbeiten und die Welt untergeht, kann ich nicht zuverlässig von jedem unserer Mitarbeiter verlangen, „auf Distribution X umzusteigen“/„auf Version Y zu aktualisieren“.

Jetzt weiß ich, wie man testet, ob ein bestimmtes Programm installiert ist (obwohl ich gestehen muss, dass mir nicht ganz klar ist, warum das eine dem anderen vorzuziehen ist, und bitte korrigieren Sie mich, wenn eines der beiden Verfahren schrecklich ist), und zwar auf folgende Weise:

type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }

...Und...

[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'

… aber in meinem speziellen Fall SIND BEIDE Plattformen fooinstalliert, aber beispielsweise hat nur MacOS ein -b/ --bar-Modifikatorflag.Wie teste ich also, ob eine bestimmte FUNKTION eines Befehls unterstützt wird?Jedes Mal, wenn ich versuche, einem der Tests eine Flagge zu übergeben, scheint das Programm, das den Test AUSFÜHRT, zu glauben, dass es an die IT gerichtet ist, ignoriert es vollständig oder gibt einen Fehler aus.

Wie kann ich testen, ob foo -b/ foo --barein gültiger/installierter/zugänglicher Befehl ist?

Update/Antwort

Da der allgemeine Konsens, der in den gut begründeten und ehrlich gesagt hervorragenden Antworten unten zum Ausdruck kommt, eine Mischung aus „nein, das kann man nicht“, unterbrochen von „es gibt einfach zu viele Faktoren, um verlässlich irgendetwas zu gewinnen, das schlüssigen, nützlichen Daten ähnelt“, zu sein scheint, schließe ich die Frage.

Meine Absicht hier war es, herauszufinden, was der richtige Ansatz ist, um das Vorhandensein einer möglicherweise nicht vorhandenen Flagge zwischen zwei verschiedenen Plattformen zu überprüfen -bekanntPlattformen, zum Glück in meinem Fall - und die in diesem Fall geeignete Taktik scheint die zu sein, die ich derzeit verfolge:Pflegen Sie zwei separate Skripte, eines für jede Plattform.

Vielen Dank an alle, die sich die Zeit genommen haben, zu antworten! Wir wissen das sehr zu schätzen.

Antwort1

Auf eine sinnvolle und zuverlässige Weise ist das wahrscheinlich nicht möglich. Sie müssen grundsätzlich jeden Befehl einzeln testen, um zu sehen, was er bewirkt. (Der Befehl „echo“ ist ein besonders schlimmes Beispiel hierfür. Es gibt viele Variationen davon.)

Sie können Versionsnummern und Betriebssystem überprüfen.

Für BASH versuchen Sie

bash --version | head -1

oder

bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"

oder verwenden Sie einfach das vordefinierte Symbol$BASH_VERSION

Für das Betriebssystem uname -sist dies ein guter Ausgangspunkt. Die anderen Optionen liefern Ihnen möglicherweise ausführlichere Informationen.

Sobald Sie diese haben, können Sie nach Bedarf mit dem Schreiben von bedingtem Code beginnen.

Nachdem das alles gesagt ist … für Ihren speziellen Fall eines fooBefehls, der eine Option annehmen kann oder nicht --bar : Finden Sie heraus, was die beiden Versionen mit übereinstimmenden Befehlszeilen machen, die ansonsten sicher ausgeführt werden können. Wenn beispielsweise beide Versionen foodie erste ungültige Option melden, versuchen Sie, etwas wie Folgendes zu schreiben:

output="$( foo --bar --somethingtotallyinvalid 2>&1 )"

und dann herauszufinden, was in der Variablenausgabe steht. In diesem Fall ist es natürlich wahrscheinlich die gültige Optionsliste. Wenn ja, könnten Sie Folgendes in Betracht ziehen:

output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"

verwandte Informationen