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_PATHCONV1
# 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.

  1. Disponible seulement pour MSYS fourni par Git for Windows