На этот вопрос уже есть ответ:
Я установил подсистему 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 разных вопроса.
Как указано последовательностями ^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