/ / Il modo migliore per eseguire diversi comandi a seconda del sistema operativo in bash: windows, macos, bash, scripting

il modo migliore per eseguire diversi comandi a seconda del sistema operativo in bash: windows, macos, bash, scripting

In uno script bash esiste un modo "ufficiale" pereseguire diversi comandi basati, ad esempio, sulla versione del sistema operativo. Intendo in un modo che puoi fondamentalmente impostarlo una volta in alto e poi chiamarlo nello stesso modo in qualsiasi altro luogo. Ho provato ad usare alias ma sembra essere un crapshoot e non funziona davvero su alcuni sistemi (uno è Windows 7 usando win-bash).

Ad esempio, questo è quello che ho provato:

if [ "$(uname)" = "Darwin" ]; then
alias p4cli=./bin/p4
else
alias p4cli=C:binp4.exe
fi

p4cli login

Funziona su Mac se lo uso shopt -s expand_aliases ma win-bash non ha shopt. Immagino che ci sia un modo migliore degli alias per farlo?

risposte:

2 per risposta № 1

Per determinare il SO sottostante in bash è meglio dipendere dalla variabile env OSTYPE. La manpage di bash dice che la variabile OSTYPE memorizza il nome del sistema operativo:

OSTYPE Imposta automaticamente su una stringa che descrive il funzionamento sistema su cui bash è in esecuzione. L'impostazione predefinita dipende dal sistema.

if [[ "$OSTYPE" == "darwin"* ]]; then
p4cli="./bin/p4"
else
p4cli="C:binp4.exe"
fi

"$p4cli" login

1 per risposta № 2

Effettua il processo che chiama p4cli responsabile di aggiungere la directory corretta al suo PATH variabile. Quindi devi solo chiamare p4cli login senza preoccuparsi della sua esatta posizione.

Presumibilmente, lo faresti da una macchina specifica (o almeno specifica per il sistema operativo) .bash_profile, che può solo hard-code la directory corretta.


0 per risposta № 3

Usa le variabili, non gli alias.

if [ "$(uname)" = "Darwin" ]; then
p4cli=(./bin/p4)
else
p4cli=("C:binp4.exe")
fi

"${p4cli[@]}" login

Creiamo gli array di variabili in modo che gli argomenti possano essere aggiunti successivamente ai comandi, se necessario.


0 per risposta № 4

Che ne dici di salvare il comando in una variabile?

if [ "$(uname)" = "Darwin" ]; then
p4cli="./bin/p4"
else
p4cli="C:binp4.exe"
fi

$p4cli login