«set -eo pipefail» не работает в подсистеме Windows для Linux (Ubuntu 16.04) [дубликат]

Я установил подсистему Windows для Linux на свой компьютер с Windows 10, который должен эмулировать Ubuntu 16.04. Когда я пытаюсь выполнить сценарий, который содержит следующие 2 строки в верхней части сценария, он выдает ошибку : неверное имя параметра установлено: pipefail

Строки сценария:

#!/bin/bash
set -eo pipefail

Этот сценарий отлично работает на моем Mac и в системе CentOS у меня есть.Я проверил (и подтвердил) свою оболочку Ubuntu, чтобы убедиться, что она поддерживает опцию pipefail в bash, выполнив set -o .

Вывод cat -net / path / to / myscript :

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

Этот вопрос был отмечен как дубликат вопроса «Как изменить окончание строки Windows на версию Unix», но я не чувствую, что это дублирует это, потому что я лично не знал, что проблема, с которой я столкнулся (которая изложена в моем вопросе), была вызвана типом окончания строки в моем сценарии оболочки. Ответ на каждый вопрос одинаковый, но было задано 2 разных вопроса.

2
задан 8 June 2018 в 12:56

1 ответ

Как указано последовательностями ^M в выходных данных cat -net, вы сохранили сценарий с окончаниями строк в стиле Windows (CRLF), а не в стиле Unix (только LF)

Фактически, мы могли бы догадаться об этом из усеченного сообщения об ошибке: «настоящая» ошибка в том, что pipefail\r является недопустимым именем опции. Однако возврат каретки приводит к тому, что курсор сбрасывается на начало строки и перезаписывает предыдущие символы. Сравните

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

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

и

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

$ ./bad.sh
: invalid option name: pipefail
10
ответ дан 8 June 2018 в 12:56

Другие вопросы по тегам:

Похожие вопросы: