web-dev-qa-db-fra.com

"set -eo pipefail" ne fonctionne pas dans le sous-système Windows pour Linux (Ubuntu 16.04)

J'ai installé le sous-système Windows pour Linux sur mon ordinateur Windows 10, qui est supposé émuler Ubuntu 16.04. Lorsque j'essaie d'exécuter un script comportant les 2 lignes suivantes en haut du script, cela me donne l'erreur :invalid option name set: pipefail

Lignes de script:

#!/bin/bash
set -eo pipefail

Ce script fonctionne correctement sur mon Mac et sur un système CentOS que je possède. J'ai vérifié (et vérifié) mon shell Ubuntu pour m'assurer qu'il prend en charge l'option pipefail de bash en exécutant set -o.

Le résultat de cat -net /path/to/myscript est:

#!/bin/bash^M$
set -eo pipefail^M$

Cette question était marquée comme une copie de "Comment changer la fin de ligne de Windows en version Unix", mais je ne pense pas que cela en fasse une duplication, car je ne savais pas personnellement que le problème que je rencontrais (ce qui est décrit dans ma question) était causé par le type de fin de ligne dans mon script Shell. La réponse à chacune des questions est la même mais deux questions différentes ont été posées.

2
phydeauxman

Comme indiqué par les séquences ^M dans votre sortie cat -net, vous avez enregistré le script avec des fins de ligne de style Windows (CRLF) plutôt que de style Unix (LF uniquement).

En fait, nous aurions pu le deviner à partir du message d'erreur tronqué: l'erreur "réelle" est que pipefail\r est un nom d'option non valide. Toutefois, le retour à la ligne amène le curseur à revenir au début de la ligne et à remplacer les caractères précédents. Comparer

$ cat -net bad.sh
     1  #!/bin/bash$
     2  set -eo fhqwhgads$

$ ./bad.sh
./bad.sh: line 2: set: fhqwhgads: invalid option name

et

$ cat -net bad.sh
     1  #!/bin/bash$
     2  set -eo pipefail^M$

$ ./bad.sh
: invalid option name: pipefail
4
steeldriver