Вот прозрачный обходной путь для вас:
cat > $'/bin/bash\r' << "EOF"
#!/bin/bash
script=$1
shift
exec bash <(tr -d '\r' < "$script") "$@"
EOF
Это избавляет от проблемы раз и навсегда, позволяя вам выполнять все сценарии Windows CRLF вашей системы, как если бы они использовали UNIX eol (с ./yourscript
), вместо того, чтобы указывать его для каждого конкретного вызова. (будьте осторожны, хотя: bash yourscript
или source yourscript
все равно не работают).
Это работает, потому что файлы стиля DOS, с точки зрения UNIX, указывают интерпретатор как «/ bin / bash ^ M». Мы переопределяем этот файл, чтобы удалить каретки из сценария и запустить фактический bash для результата.
Вы можете сделать то же самое для разных интерпретаторов, таких как /bin/sh
, если хотите.