#prog #julia #rust #rustlib #article
Первая статья — Shelling Out Sucks — рассказывает, что не так с языковыми средствами для запуска шелла (такими, как в Perl и в Ruby с backtick-строками, например). Тезисно:
1. Для интерполяции переменных используется обычная строковая интерполяция, которая не экранирует символы со специальным значением для шелла — что ломает пайплайны, если туда затёсывается, скажем, пробел или кавычка.
2. Для исполнения команды запускается шелл, который, в свою очередь, уже запускает переданную команду — что не слишком эффективно и, вообще говоря, избыточно.
3. Ошибки по умолчанию проглатываются (из-за посредника в виде процесса шелла), а при использовании средств вроде
3.1. Некоторые команды оболочки и программы используют код завершения не для передачи статуса ошибки, а для передачи полезной информации (grep, например), что плохо сочетается с
В статье Put This In Your Pipe рассказывается, как эта проблема была решена в Julia. В языке также присутствует синтаксис backtick-строк, но он реализует другой функционал. А именно:
* вместо немедленного запуска команды строка формирует объект, который представляет собой команду. В частности, на этом этапе строка делится на имя запускаемой программы и её аргументы.
* синтаксис для интерполяции значений (не только переменных, но и выражений) уже делает необходимое экранирование.
* интерполяция массивов работает аналогично shell expansion вместо вставки разделённых пробелами строк.
* функции для запуска команд порождают процессы и собирает их коды возврата самостоятельно, без делегации командной оболочке.
В Rust есть библиотеки для запуска команд, основанные на похожих принципах: xshell (от Алексея Кладова) и более продвинутая duct, позволяющая пайпить команды. Документация xshell прямо отсылает к "Shelling out sucks" и "Put this in your pipe", а документация duct дополнительно рассказывает о том, какие ловушки закрывает.
P. S.: тот факт, что в Unix-like системах до сих пор нет вменяемого способа завершить дерево процессов более чем единичной глубины — это охренеть как странно.
Первая статья — Shelling Out Sucks — рассказывает, что не так с языковыми средствами для запуска шелла (такими, как в Perl и в Ruby с backtick-строками, например). Тезисно:
1. Для интерполяции переменных используется обычная строковая интерполяция, которая не экранирует символы со специальным значением для шелла — что ломает пайплайны, если туда затёсывается, скажем, пробел или кавычка.
2. Для исполнения команды запускается шелл, который, в свою очередь, уже запускает переданную команду — что не слишком эффективно и, вообще говоря, избыточно.
3. Ошибки по умолчанию проглатываются (из-за посредника в виде процесса шелла), а при использовании средств вроде
set pipefail
ошибки недостаточно подробны, так как не говорят, какая именно команда завершилась ошибкой.3.1. Некоторые команды оболочки и программы используют код завершения не для передачи статуса ошибки, а для передачи полезной информации (grep, например), что плохо сочетается с
set pipefail
.В статье Put This In Your Pipe рассказывается, как эта проблема была решена в Julia. В языке также присутствует синтаксис backtick-строк, но он реализует другой функционал. А именно:
* вместо немедленного запуска команды строка формирует объект, который представляет собой команду. В частности, на этом этапе строка делится на имя запускаемой программы и её аргументы.
* синтаксис для интерполяции значений (не только переменных, но и выражений) уже делает необходимое экранирование.
* интерполяция массивов работает аналогично shell expansion вместо вставки разделённых пробелами строк.
* функции для запуска команд порождают процессы и собирает их коды возврата самостоятельно, без делегации командной оболочке.
В Rust есть библиотеки для запуска команд, основанные на похожих принципах: xshell (от Алексея Кладова) и более продвинутая duct, позволяющая пайпить команды. Документация xshell прямо отсылает к "Shelling out sucks" и "Put this in your pipe", а документация duct дополнительно рассказывает о том, какие ловушки закрывает.
P. S.: тот факт, что в Unix-like системах до сих пор нет вменяемого способа завершить дерево процессов более чем единичной глубины — это охренеть как странно.
👍6
Блог*
Люблю, когда у меня в руках толстый кошель 🤤
Так, я понял. У меня нет донатов, потому что мои подписчики не любят толстые кошельки
🤡12🍌2😢1
#prog #rust #article
Winning the fight against the Rust compiler (Coherence in Rust, feat. rustc sources)
Или неглубокое погружение в coherence check в rustc.
Winning the fight against the Rust compiler (Coherence in Rust, feat. rustc sources)
Или неглубокое погружение в coherence check в rustc.
ohadravid.github.io
Winning the fight against the Rust compiler (Coherence in Rust, feat. rustc sources)
Ohad's blog
❤5