Как настроить bash для обработки сценариев оболочки CRLF?

Я хочу выполнить сценарии bash, которые используют окончания строк Windows/CRLF.

Я знаю пакет tofrodos и как fromdos файлы fromdos, но, если возможно, я хотел бы запускать их без каких-либо изменений.

Есть ли переменная среды, которая заставит bash обрабатывать CRLF?

Ответ 1

Может быть, так?

dos2unix < script.sh|bash -s

EDIT: Как указано в комментариях, это лучший вариант, поскольку он позволяет сценарию читать из stdin, запуская dos2unix, а не bash в подоболочке:

bash <(dos2unix < script.sh)

Ответ 2

Вот вам прозрачное обходное решение:

cat > $'/bin/bash\r' << "EOF"
#!/bin/bash
script=$1
shift
exec bash <(tr -d '\r' < "$script") "[email protected]"
EOF

Это избавляет от проблемы раз и навсегда, позволяя вам выполнять все сценарии Windows CRLF системы, как если бы они использовали UNIX eol (с ./yourscript), вместо того, чтобы указывать его для каждого конкретного вызова. (будьте осторожны: bash yourscript или source yourscript будет по-прежнему терпеть неудачу).

Он работает, потому что файлы стиля DOS, с точки зрения UNIX, указывают интерпретатор как "/bin/bash ^ M". Мы переопределяем этот файл, чтобы удалить каретки из сценария и запустить фактический bash для результата.

Вы можете сделать то же самое для разных интерпретаторов, таких как /bin/sh если хотите.