MSYS – éviter l’évaluation des arguments comme des chemins
Si vous êtes sous MS Windows et que vous faites du Bash ou autres scripts en ligne de commandes, vous utilisez sûrement MSYS. Dans ce cas, n’avez-vous pas rencontré quelques difficultés avec des paramètres commençant par le caractère « / » ?
Par exemple, avec Docker :
$ docker run -w /tmp ubuntu ls -la docker: Error response from daemon: The working directory 'C:/Users/pnom/AppData/Local/Temp' is invalid. It needs to be an absolute path.. See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
Celà vient du fait que MSYS converti les paramètres en chemin POSIX. Pour palier à ce problème, l’astuce avec Docker consiste à préfixer tous les chemins avec un caractère « / » :
$ docker run -w //tmp ubuntu ls -la total 8 drwxrwxrwt 2 root root 4096 Oct 9 2015 . drwxr-xr-x 32 root root 4096 Jul 6 6:32 ..
Même si ce n’est pas naturel, ce contournement est assez simple et efficace. Cela fonctionne seulement pour les arguments qui représentent des chemins. En effet, prenons le cas du client AWS qui permet de lister les logs :
$ aws logs describe-log-streams \ --log-group-name /aws/lambda/MyLambda \ --query 'logStreams[*].logStreamName' \ --output text A client error (InvalidParameterException) occurred when calling the DescribeLogStreams operation: 1 validation error detected: Value 'C:/Program Files/Git/aws/lambda/MyLambda' at 'logGroupName' failed to satisfy constraint: Member must satisfy regular expression pattern: [\.\-_/#A-Za-z0-9]+
Si nous essayons d’ajouter le caractère « / » :
$ aws logs describe-log-streams \ --log-group-name //aws/lambda/MyLambda \ --query 'logStreams[*].logStreamName' \ --output text A client error (ResourceNotFoundException) occurred when calling the DescribeLogStreams operation: The specified log group does not exist.
Pourquoi cette erreur ? Parce que le client AWS va rechercher un groupe de logs se nommant //aws/lambda/MyLambda
. Or ce groupe n’existe pas.
Il existe deux solutions :
- Fournir une liste de préfixes de valeur de paramètre à ne pas convertir avec la variable
MSYS2_ARG_CONV_EXCL
- Désactiver la conversion POSIX des chemins avec la variable
MSYS_NO_PATHCONV
1
# désactiver la conversion pour les paramètres commençant par "/aws/lambda" et "/aws/sqs" $ export MSYS2_ARG_CONV_EXCL="/aws/lambda;/aws/sqs" $ aws logs describe-log-streams \ --log-group-name /aws/lambda/MyLambda \ --query 'logStreams[*].logStreamName' \ --output text 2016/07/06/[$LATEST]1edd6b3d27fc42c9baccb05c08b6cd66 # désactiver la conversion pour tous les paramètres $ export MSYS_NO_PATHCONV=1 $ aws logs describe-log-streams \ --log-group-name /aws/lambda/MyLambda \ --query 'logStreams[*].logStreamName' \ --output text 2016/07/06/[$LATEST]1edd6b3d27fc42c9baccb05c08b6cd66
A noter que Docker Machine n’apprécie pas trop l’utilisation de la variable MSYS_NO_PATHCONV
. A vous donc de choisir l’option la plus adaptée à votre usage.
- Disponible seulement pour MSYS fourni par Git for Windows ↩
Sur ta solution 2, tu cites la variable MSYS2_ARG_CONV_EXCL alors que je pense que tu voulais déjà parler de la variable MSYS_NO_PATHCONV que tu cites à la fin.
Justement, pour ce qui est de l’usage la variable MSYS_NO_PATHCONV, je crois aussi qu’il faut mettre un gros warning sur son usage. En effet elle n’est reconnue par aucune version officielle de MSYS. Elle l’est uniquement dans le fork de MSYS intégré dans Git for Windows où un patch spécifique a été ajouté pour le support de cette variable. Ce patch n’est remonté sur aucune des versions officielles de MSYS.
Sur le net, on tombe facilement sur des infos sur l’usage de la variable MSYS_NO_PATHCONV. Il faut être conscient que son usage est réservé à un contexte très spécifique: uniquement si le MSYS utilisé est celui fourni par Git for Windows.
Pour info, l’historique du patch MSYS_NO_PATHCONV : https://github.com/git-for-windows/msys2-runtime/pull/11
Sinon, il y a une autre solution, c’est de faire comme moi: Utiliser Linux de bout en bout (et mettre Windows dans une VM) 😉
Merci Laurent pour tes remarques toujours aussi pertinentes !
J’ai corrigé le nom de la variable dans la solution 2. Et effectivement, l’utilisation de MSYS_NO_PATHCONV ressemble plus à un quick win qu’à une vraie solution.
Personnellement, j’utilise MSYS2_ARG_CONV_EXCL= »/aws » et je continue à préfixer avec des doubles slashs les commandes Docker…
Ta solution est sûrement la meilleure. 🙂 Mais je n’ai jamais pris le temps de chercher la bonne distribution pour mon Zenbook. Si quelqu’un connais une distribution qui supporte bien le Zenbook Prime UX31A, je prends ! 😉