“set -eo pipefail” não funciona no Windows Subsystem para Linux (Ubuntu 16.04) [duplicado]

1

Instalei o subsistema Windows para Linux na minha máquina Windows 10, que deveria estar emulando o Ubuntu 16.04. Quando tento executar um script que tem as duas linhas a seguir na parte superior do script, isso me dá o erro :invalid option name set: pipefail

Linhas de script:

#!/bin/bash
set -eo pipefail

Esse script roda bem no meu Mac e em um sistema CentOS que eu tenho. Eu conferi (e verifiquei) meu shell do Ubuntu para garantir que ele suporte a opção pipefail no bash executando set -o .

A saída de cat -net /path/to/myscript é:

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

Esta questão foi marcada como uma duplicata de "Como alterar a terminação de linha do Windows para a versão Unix", mas não sinto que seja uma duplicação disso, porque eu pessoalmente não sabia que o problema que estava tendo (que é descrito em minha pergunta) estava sendo causada pelo tipo de fim de linha no meu shell script. A resposta em cada uma das perguntas é a mesma, mas duas perguntas diferentes foram feitas.

    
por phydeauxman 06.06.2018 / 22:02

1 resposta

3

Como indicado pelas seqüências ^M na sua saída cat -net , você salvou o script com finais de linha no estilo Windows (CRLF) em vez de no estilo Unix (somente LF)

Na verdade, poderíamos ter adivinhado que, a partir da mensagem de erro truncada: o erro "real" é que pipefail\r é um nome de opção inválido. No entanto, o retorno de carro faz com que o cursor seja redefinido para o início da linha e sobrescreva os caracteres anteriores. Comparar

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

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

e

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

$ ./bad.sh
: invalid option name: pipefail
    
por steeldriver 06.06.2018 / 23:32