meilleur moyen d’exécuter des commandes différentes en fonction du système d’exploitation en bash

Dans un script bash, existe-t-il un moyen “officiel” d’exécuter différentes commandes basées, par exemple, sur la version du système d’exploitation. Je veux dire en gros que vous pouvez le définir une fois en haut et l’appeler de la même façon partout ailleurs. J’ai essayé d’utiliser des alias, mais cela semble être un crapshoot et ne fonctionne pas vraiment sur certains systèmes (l’un est Windows 7 avec win-bash).

Par exemple, c’est ce que j’ai essayé:

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

Il fonctionne sur Mac si j’utilise shopt -s expand_aliases mais win-bash n’a pas shopt. Je suppose qu’il existe un meilleur moyen que les alias pour faire cela?

Pour déterminer le système d’exploitation sous-jacent en bash, il est préférable de dépendre de la variable env OSTYPE . La page de manuel bash indique que la variable OSTYPE stocke le nom du système d’exploitation:

OSTYPE Définit automatiquement une chaîne décrivant le système d’exploitation sur lequel bash s’exécute. La valeur par défaut dépend du système.

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

Rendre le processus qui appelle p4cli responsable de l’ajout du répertoire correct à sa variable PATH . Ensuite, il vous suffit d’appeler p4cli login sans vous soucier de son emplacement exact.

Vraisemblablement, vous le feriez à partir d’un .bash_profile spécifique à la machine (ou du moins spécifique à l’OS), qui peut simplement coder en dur le répertoire correct.

Utilisez des variables, pas des alias.

 if [ "$(uname)" = "Darwin" ]; then p4cli=(./bin/p4) else p4cli=('C:\bin\p4.exe') fi "${p4cli[@]}" login 

Nous construisons les tableaux de variables afin que des arguments puissent être ajoutés aux commandes ultérieurement si nécessaire.

Que diriez-vous de sauvegarder la commande dans une variable?

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