Проблемы с скриптом Bash [дубликат]

Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.

Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.

  1. Ваша точка входа (ов) выполняется в результате события. Например, в браузер загружается тег сценария с кодом. (Соответственно, поэтому вам, возможно, придется заботиться о готовности страницы запускать ваш код, если он требует, чтобы элементы dom были сконструированы первыми и т. Д.)
  2. Ваш код выполняется до завершения, однако многие асинхронные вызовы, которые он делает, без выполнения каких-либо ваших обратных вызовов, включая запросы XHR, установку тайм-аутов, обработчиков событий dom и т. д. Каждый из этих обратных вызовов, ожидающих выполнения, будет находиться в очереди, ожидая, что их очередь будет запущена после других событий
  3. Каждый отдельный обратный вызов XHR-запроса, установленного таймаута или dom события после вызова будет завершен.

Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.

Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.

12
задан mcandre 30 January 2013 в 19:13
поделиться

2 ответа

Возможно, это так?

dos2unix < script.sh|bash -s

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

bash <(dos2unix < script.sh)
12
ответ дан Magnus Gustavsson 5 September 2018 в 09:46
поделиться

Вот прозрачный обходной путь для вас:

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, если хотите.

8
ответ дан that other guy 5 September 2018 в 09:46
поделиться
Другие вопросы по тегам:

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