Я могу получить ту же ошибку, если первая строка заканчивается только CR (вместо LF):
$ echo -en '#!/bin/bash\rexport foo=bar\n' > test.sh
$ chmod +x test.sh
$ ./test.sh
export: bad interpreter: No such file or directory
Что происходит, так это то, что ядро выглядит для программы-интерпретатора с именем / bin / bash \ rexport
, не находит ее и выдает ошибку. Bash выводит сообщение об ошибке с именем файла
bash: ./test.sh: /bin/bash\rexport: bad interpreter: No such file or directory
, но, поскольку возврат каретки перемещает вывод обратно в начало строки, вы видите только
export: bad interpreter: No such file or directory
Таким образом, проблема, похоже, связана с окончанием строки.
Обратите внимание, что с окончанием строки CRLF в стиле DOS результат будет другим, так как теперь есть LF для завершения строки.
$ echo -en '#!/bin/bash\r\nexport foo=bar\n' > test.sh
$ ./test.sh
bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory
Хотя я не знаю, почему на этот раз bash цитирует CR при выводе как ^ M
.
IIRC - единственный CR в виде окончания строки - это пережиток старых систем Mac, и dos2unix
, похоже, не исправляет его по умолчанию. Вам нужно будет использовать mac2unix
или dos2unix -c mac
.
Что-то вроде этого должно также превратить все CR или CRLF в окончание строк LF в стиле Unix, если у вас смешаны все стили и нет необходимости в CR в каком-либо другом смысле.
sed 's/\r/\n/g;s/\n$//' backup.sh