Я хочу выполнить сценарий оболочки при обработке вывода stdout и stderr. В настоящее время я выполняю команды с использованием Process.run
, с shell=false
и тремя трубами для stdin, stdout и stderr. Я порою волокна, чтобы читать из stdout и stderr и регистрировать (или иначе обрабатывать) выход. Это очень хорошо работает для отдельных команд, но неудачно для скриптов.Как выполнить скрипт оболочки в Crystal при захвате вывода?
Я мог бы просто установить shell=true
при вызове Process.run
, но, глядя на источник кристалла, кажется, что просто добавляет «sh» к командной строке. Я пробовал добавить «bash», и это не помогло.
вещь, как перенаправление (>file
) и трубы (например, curl something | bash
) не похож на работу с Process.run
Например, чтобы загрузить скрипт и выполнить его, я попробовали:
ЦМД =% {bash -c "curl http://dist.crystal-lang.org/apt/setup.sh" | баш}
Process.run (CMD, ...)
bash
Начальное был добавлен в надежде, что это позволит оператору трубы. Кажется, это не помогает. Я также попытался выполнения каждой команды отдельно:.
script.split ("\ п") отклонять (/^# /, "") .each {Process.run (...)}
Но, конечно, это все еще не удается, когда команда использует перенаправление или каналы. Например, команда echo "deb http://dist.crystal-lang.org/apt crystal main" >/etc/apt/sources.list.d/crystal.list
просто выводит:
"Deb http://dist.crystal-lang.org/apt кристалл главный">/и т.д./кв/sources.list.d/crystal.list`
Это может сработать, если я использовал ``
backticks метод исполнения вместо этого; но тогда я не смог бы захватить вывод в режиме реального времени.
Вам необходимо переместить трубопровод в 'bash -c' в первом случае, чтобы заставить его вызвать. Вы сражаетесь с 'shell = false', но это то, что позволит вам напрямую использовать синтаксис оболочки. – Petesh
@Petesh К сожалению, установка 'shell = true' не помогает. –
@Petesh Перемещение конвейера в вызов 'bash -c', похоже, работает. Итак ... почему не работает 'shell = true'? Неужели это почти то же самое? –