{"id":481755,"date":"2026-05-31T09:32:10","date_gmt":"2026-05-31T09:32:10","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481755"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481755","title":{"rendered":"\u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435: muenvsubst \u2014 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 envsubst"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0420\u0430\u043d\u0435\u0435 \u044f \u0443\u0436\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b \u043f\u043e\u0441\u0442 \u043e\u0431 \u044d\u0442\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u0435, \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0448\u0438\u043b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0451 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u0438 \u0434\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u043e\u0434\u0440\u043e\u0441 \u0437\u0430 \u0433\u043e\u0434.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>\u042f \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043b\u0438\u043d\u0443\u043a\u0441\u043e\u0432\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <a href=\"https:\/\/linux.die.net\/man\/1\/envsubst\" rel=\"noopener noreferrer nofollow\">envsubst<\/a>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0451 \u0443\u0434\u043e\u0431\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u041d\u043e \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u0432 \u0442\u0435\u043a\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u043d\u044f\u0442\u044c $VAR_NAME \u043d\u0430 \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code>echo \"Hello, $USER!\" | envsubst<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u044f \u043d\u0430\u0448\u0435\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430 Mustache \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c bash &#8212; <a href=\"https:\/\/github.com\/tests-always-included\/mo\" rel=\"noopener noreferrer nofollow\">mo<\/a>. \u0418 \u0434\u043e\u043b\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e envsubst. <a href=\"https:\/\/mustache.github.io\/mustache.5.html\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/a> Mustache \u0434\u0430\u0432\u0430\u043b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 envsubst.<\/p>\n<pre><code>echo \"Hello, {{ USER }}!\" | mo<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 Mustache \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0435\u043d, \u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u043e\u043f\u043b\u0430\u043d\u0435\u0442\u0435\u043d, \u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0438 \u043f\u043e\u0438\u0441\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c. \u042f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <a href=\"https:\/\/pypi.org\/project\/Jinja2\/\" rel=\"noopener noreferrer nofollow\">Jinja<\/a>, <a href=\"https:\/\/docs.ruby-lang.org\/en\/2.3.0\/ERB.html\" rel=\"noopener noreferrer nofollow\">ERB<\/a>, <a href=\"https:\/\/freemarker.apache.org\/index.html\" rel=\"noopener noreferrer nofollow\">Freemarker<\/a> \u0438 \u043f\u0440., \u0438 \u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435, \u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0442\u044f\u043d\u0443\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u044f\u0437\u044b\u043a \u0438 \u0435\u0433\u043e \u0436\u0438\u0440\u043d\u044b\u0439 \u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u0414\u0430, \u044f \u0432\u0438\u0434\u0435\u043b \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u044b-\u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u043d\u0430 Go, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/hairyhenderson\/gomplate\" rel=\"noopener noreferrer nofollow\">Gomplate<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432 \u0441\u0442\u0430\u0442\u0438\u043a\u0443, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u0433\u043b\u044f\u0436\u0443 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u0438\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u043c\u043d\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u0440\u0443\u0441\u0442\u043d\u043e (~100\u041c\u0431). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0438 \u043d\u0430 Rust, \u043d\u043e \u044f \u0443\u0436\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e )<\/p>\n<h2>\u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 muenvsubst<\/h2>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u044f \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0442\u0430\u043a \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/navrocky\/muenvsubst\" rel=\"noopener noreferrer nofollow\">muenvsubst<\/a>. \u0423 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u043d\u0430 C++. \u042f \u0432 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u0430\u043b\u0441\u044f \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u0438, \u0441 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c <a href=\"https:\/\/conan.io\/\" rel=\"noopener noreferrer nofollow\">conan<\/a> \u0434\u043b\u044f C++. \u041d\u0430\u0448\u0435\u043b \u0432 Conan Center \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 <a href=\"https:\/\/conan.io\/center\/recipes\/mbits-mstch?version=1.0.4\" rel=\"noopener noreferrer nofollow\">mustache<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0438 \u043d\u0438 \u043e\u0442 \u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0431\u044b\u043b \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 \u044d\u0442\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c, \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 &#171;mu&#187; \u043f\u0435\u0440\u0435\u0434 envsubst. \u0421 \u044d\u0442\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 Alpine \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f 1,3\u041c\u0431, \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u043b\u043e!<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u0432\u0451\u043b \u0431\u043e\u0440\u044c\u0431\u0443 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u044f \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043b \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 Alpine \u043d\u0430 <a href=\"https:\/\/www.uclibc.org\/\" rel=\"noopener noreferrer nofollow\">uClibc<\/a>, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u0441\u0442\u0430\u043b 900\u041a\u0431, \u0442\u0430\u043a\u0436\u0435 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b upx \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b 260\u041a\u0431, \u044d\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u044f\u043c\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 Git \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<p>\u0412\u0441\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/navrocky\/muenvsubst\/blob\/master\/Dockerfile.uclibc\" rel=\"noopener noreferrer nofollow\">Dockerfile<\/a>. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b <a href=\"https:\/\/github.com\/navrocky\/buildroot-uclibc-toolchain\" rel=\"noopener noreferrer nofollow\">\u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437<\/a> \u0441 <a href=\"https:\/\/www.uclibc.org\/\" rel=\"noopener noreferrer nofollow\">uClibc<\/a> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/buildroot.org\/\" rel=\"noopener noreferrer nofollow\">Buildroot<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 gnu libc &#8212; \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0433\u0440\u043e\u043c\u0430\u0434\u043d\u044b\u0439 \u043c\u043e\u043d\u0441\u0442\u0440 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439.<\/p>\n<p>\u041a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u044c\u0448\u0435 &#8212; mustache \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0435\u043d, \u044f \u043d\u0430\u0448\u0435\u043b \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 <a href=\"https:\/\/pantor.github.io\/inja\/\" rel=\"noopener noreferrer nofollow\">Inja<\/a>, \u043e\u043d \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/conan.io\/center\/recipes\/inja?version=3.5.0\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/a> \u043d\u0430 Conan Center. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 <a href=\"https:\/\/conan.io\/center\/recipes\/jinja2cpp?version=1.3.2\" rel=\"noopener noreferrer nofollow\">jinja2cpp<\/a> \u043d\u043e \u0442\u0430\u043c \u0434\u043e \u0447\u0451\u0440\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043c\u043d\u0435 \u0442\u0430\u043a\u043e\u0435 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f 1.1.0, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0430 \u0434\u0432\u0430 \u0434\u0432\u0438\u0436\u043a\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 mstch \u0438 inja, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u043f\u043e\u0434\u0440\u043e\u0441 \u043d\u0430 100\u041a\u0431. <\/p>\n<h2>\u0427\u0442\u043e \u0438\u043c\u0435\u0435\u043c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442<\/h2>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043a\u0438\u043d\u0443\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 mstch \u0438\u0437 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a Inja \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. <\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 envsubst &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 (stdin) \u0448\u0430\u0431\u043b\u043e\u043d \u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 (stdout) \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u043a\u0430\u043a \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c envsubst. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b. <\/p>\n<pre><code>echo \"Hello, {{ USER }}!\" | muenvsubstmuenvsubst -i template.txt -o result.txt<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b Inja:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<pre><code>Hello, {{ USER }}!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<pre><code>\/\/ \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u043b\u044f Jinja2{% if USER == \"John\" %} {{ USER }} {% endif %}\/\/ \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439## if USER == \"John\"{{ USER }}## endif<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<\/ul>\n<pre><code>## set userName = \"mr. \" + USERHello, {{ userName }}!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<\/p>\n<\/li>\n<\/ul>\n<pre><code>\/\/ \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439## if USER == \"John\"Hello, John!## elseYou're not John## endif<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u0446\u0438\u043a\u043b<\/p>\n<\/li>\n<\/ul>\n<pre><code>## set i = 1## for elem in split(PATH, \":\")Path elem {{ i }}: {{ elem }}## set i = i + 1## endfor<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code>upper(s: string): string \/\/ \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440lower(s: string): string \/\/ \u0432 \u043d\u0438\u0436\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440capitalize(s: string): string \/\/ \u041f\u0435\u0440\u0432\u0443\u044e \u0431\u0443\u043a\u0432\u0443 \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440replace(s: string, from: string: to: string): string \/\/ \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 from \u043d\u0430 torange(num: int): array&lt;int&gt; \/\/ \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 0length(val: string | array): int \/\/ \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430first(arr: array&lt;T&gt;): T \/\/ \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435last(arr: array&lt;T&gt;): T \/\/ \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435sort(arr: array): array \/\/ \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430join(arr: array, delimiter: string): string \/\/ \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043cround(v: float): int \/\/ \u043e\u043a\u0440\u0443\u0433\u043b\u0438\u0442\u044c \u0434\u043e \u0446\u0435\u043b\u043e\u0433\u043eodd(v: int): bool \/\/ \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0447\u0451\u0442\u043d\u043e\u0435?even(v: int): bool \/\/ \u0447\u0438\u0441\u043b\u043e \u0447\u0451\u0442\u043d\u043e\u0435?divisibleBy(v: int, divider: int): bool \/\/ \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 divider?max(arr: array&lt;T&gt;): T \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435min(arr: array&lt;T&gt;): T \/\/ \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435int(s: string): int \/\/ \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043efloat(s: string): float \/\/ \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 floatdefault(var: variable, val: T): T \/\/ \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044eexists(varName: string): bool \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439existsIn(obj: object, varName: string): bool \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435isString(v: T): bool \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0430?isArray(v: T): bool \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>includes<\/p>\n<\/li>\n<\/ul>\n<pre><code>Hello, {{ userName }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code>## set userName=\"John\"## include \"greeter.j2\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0434\u043b\u044f Inja \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b:<\/p>\n<ul>\n<li>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<pre><code>error(message: string) \/\/ \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438fromBase64(base64: string): string \/\/ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 base64toBase64(text: string): string \/\/ \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 base64fromJson(json: string): json \/\/ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JsontoJson(value: any, indent: int?): string \/\/ \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Jsonsh(stdin: string?, command: string): string \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 sh \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435split(text: string, delimiter: string): string \/\/ \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0435toBool(value: any): boolean \/\/ \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0432 booltrim(text: string): string \/\/ \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u043f\u043e \u043a\u0440\u0430\u044f\u043ccenter(text: string, width: int = 80): string \/\/ \u043e\u0442\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u0435indent(text: string, width: int | string, first: boolean = false, blank: boolean = false): string \/\/ \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0432\u0430 \u043e\u0442\u0441\u0442\u0443\u043f\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>sh<\/strong>, \u043e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0432\u0430\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0430 bash \u0435\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0432 \u0447\u0451\u043c-\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438:<\/p>\n<\/li>\n<\/ul>\n<pre><code>{{ sh(\"hostname\") }}{{ sh(\"uuidgen\") | replace(\"-\", \"\") }}{{ \"Hello John!\" | sh(\"sed 's\/John\/Mary\/'\") }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Jinja2 (MR \u0432 Inja &#8212; <a href=\"https:\/\/github.com\/pantor\/inja\/pull\/334\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/pantor\/inja\/pull\/334<\/a>)<\/p>\n<\/li>\n<\/ul>\n<pre><code>{% macro greeter(name, greeting=\"Hello\") %}{{ greeting }}, {{ name }}!{% endmacro -%}{{ greeter(USER) }}{{ greeter(\"World\", \"Hi\") }}{{ greeter(\"World\", \"Hi\") }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Jinja2 (MR \u0432 Inja &#8212; <a href=\"https:\/\/github.com\/pantor\/inja\/pull\/336\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/pantor\/inja\/pull\/336<\/a>). \u0424\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 replace, uppercase \u0438 \u0442.\u0434, \u043d\u0430 \u0447\u0442\u043e \u0445\u0432\u0430\u0442\u0438\u0442 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438: <\/p>\n<\/li>\n<\/ul>\n<pre><code>## filter indent(\"\/\/ \", true)line1line2## endfilter<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 pipe \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e &#171;|&#187;. \u042d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 <a href=\"https:\/\/github.com\/pantor\/inja\/pull\/296\" rel=\"noopener noreferrer nofollow\">MR<\/a> \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442 \u0432 Inja \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 3.5:<\/p>\n<\/li>\n<\/ul>\n<pre><code>\"A,B,C\" | split(\",\") | join(\";\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 &#171;mu &#8212; \u03bc&#187; \u0443\u0436\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043c\u0438\u043a\u0440\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0430 \u043d\u0435 mustache.<\/p>\n<p>\u041c\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u043e \u0432\u0441\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u044d\u0442\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043a\u043e\u0439. \u041e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0447\u0442\u043e \u043a\u043e\u043c\u0443-\u0442\u043e \u0435\u0449\u0451 \u043e\u043d\u0430 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f. <\/p>\n<p>\u0412 \u043f\u043b\u0430\u043d\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0444\u0438\u0447 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sh \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b \u043d\u0430 \u0432\u0445\u043e\u0434\u0435, \u0444\u0430\u0439\u043b\u044b \u0441 JSON \u0438\u043b\u0438 YAML \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0434 Mac \u0438 Windows. \u041d\u043e \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1041580\/\">https:\/\/habr.com\/ru\/articles\/1041580\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u0430\u043d\u0435\u0435 \u044f \u0443\u0436\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b \u043f\u043e\u0441\u0442 \u043e\u0431 \u044d\u0442\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u0435, \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0448\u0438\u043b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0451 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u0438 \u0434\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u043e\u0434\u0440\u043e\u0441 \u0437\u0430 \u0433\u043e\u0434.\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f\u042f \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043b\u0438\u043d\u0443\u043a\u0441\u043e\u0432\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 envsubst, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0451 \u0443\u0434\u043e\u0431\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u041d\u043e \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u0432 \u0442\u0435\u043a\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u043d\u044f\u0442\u044c $VAR_NAME \u043d\u0430 \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.echo &#171;Hello, $USER!&#187; | envsubst\u0417\u0430\u0442\u0435\u043c \u044f \u043d\u0430\u0448\u0435\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430 Mustache \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c bash &#8212; mo. \u0418 \u0434\u043e\u043b\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e envsubst. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 Mustache \u0434\u0430\u0432\u0430\u043b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 envsubst.echo &#171;Hello, {{ USER }}!&#187; | mo\u041d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 Mustache \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0435\u043d, \u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u043e\u043f\u043b\u0430\u043d\u0435\u0442\u0435\u043d, \u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0430.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0438 \u043f\u043e\u0438\u0441\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c. \u042f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Jinja, ERB, Freemarker \u0438 \u043f\u0440., \u0438 \u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435, \u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0442\u044f\u043d\u0443\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u044f\u0437\u044b\u043a \u0438 \u0435\u0433\u043e \u0436\u0438\u0440\u043d\u044b\u0439 \u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u0414\u0430, \u044f \u0432\u0438\u0434\u0435\u043b \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u044b-\u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u043d\u0430 Go, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Gomplate, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432 \u0441\u0442\u0430\u0442\u0438\u043a\u0443, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u0433\u043b\u044f\u0436\u0443 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u0438\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u043c\u043d\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u0440\u0443\u0441\u0442\u043d\u043e (~100\u041c\u0431). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0438 \u043d\u0430 Rust, \u043d\u043e \u044f \u0443\u0436\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e )\u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 muenvsubst\u0412 \u043e\u0431\u0449\u0435\u043c \u044f \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0442\u0430\u043a \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 muenvsubst. \u0423 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u043d\u0430 C++. \u042f \u0432 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u0430\u043b\u0441\u044f \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u0438, \u0441 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c conan \u0434\u043b\u044f C++. \u041d\u0430\u0448\u0435\u043b \u0432 Conan Center \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 mustache, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0438 \u043d\u0438 \u043e\u0442 \u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0431\u044b\u043b \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 \u044d\u0442\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c, \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 &#171;mu&#187; \u043f\u0435\u0440\u0435\u0434 envsubst. \u0421 \u044d\u0442\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 Alpine \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f 1,3\u041c\u0431, \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u043b\u043e!\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u0432\u0451\u043b \u0431\u043e\u0440\u044c\u0431\u0443 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u044f \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043b \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 Alpine \u043d\u0430 uClibc, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u0441\u0442\u0430\u043b 900\u041a\u0431, \u0442\u0430\u043a\u0436\u0435 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b upx \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b 260\u041a\u0431, \u044d\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u044f\u043c\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 Git \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f.\u0412\u0441\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Dockerfile. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0441 uClibc \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Buildroot, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 gnu libc &#8212; \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0433\u0440\u043e\u043c\u0430\u0434\u043d\u044b\u0439 \u043c\u043e\u043d\u0441\u0442\u0440 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439.\u041a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u044c\u0448\u0435 &#8212; mustache \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0435\u043d, \u044f \u043d\u0430\u0448\u0435\u043b \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 Inja, \u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 Conan Center. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 jinja2cpp \u043d\u043e \u0442\u0430\u043c \u0434\u043e \u0447\u0451\u0440\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043c\u043d\u0435 \u0442\u0430\u043a\u043e\u0435 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f 1.1.0, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0430 \u0434\u0432\u0430 \u0434\u0432\u0438\u0436\u043a\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 mstch \u0438 inja, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u043f\u043e\u0434\u0440\u043e\u0441 \u043d\u0430 100\u041a\u0431. \u0427\u0442\u043e \u0438\u043c\u0435\u0435\u043c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043a\u0438\u043d\u0443\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 mstch \u0438\u0437 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a Inja \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 envsubst &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 (stdin) \u0448\u0430\u0431\u043b\u043e\u043d \u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 (stdout) \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u043a\u0430\u043a \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c envsubst. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b. echo &#171;Hello, {{ USER }}!&#187; | muenvsubstmuenvsubst -i template.txt -o result.txt\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b Inja:\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445Hello, {{ USER }}!\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439\/\/ \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u043b\u044f Jinja2{% if USER == &#171;John&#187; %} {{ USER }} {% endif %}\/\/ \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439## if USER == &#171;John&#187;{{ USER }}## endif\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435## set userName = &#171;mr. &#187; + USERHello, {{ userName }}!\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\/\/ \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439## if USER == &#171;John&#187;Hello, John!## elseYou&#8217;re not John## endif\u0446\u0438\u043a\u043b## set i = 1## for elem in split(PATH, &#171;:&#187;)Path elem {{ i }}: {{ elem }}## set i = i + 1## endfor\u0444\u0443\u043d\u043a\u0446\u0438\u0438upper(s: string): string \/\/ \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440lower(s: string): string \/\/ \u0432 \u043d\u0438\u0436\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440capitalize(s: string): string \/\/ \u041f\u0435\u0440\u0432\u0443\u044e \u0431\u0443\u043a\u0432\u0443 \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440replace(s: string, from: string: to: string): string \/\/ \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 from \u043d\u0430 torange(num: int): array&lt;int&gt; \/\/ \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 0length(val: string | array): int \/\/ \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430first(arr: array&lt;T&gt;): T \/\/ \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435last(arr: array&lt;T&gt;): T \/\/ \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435sort(arr: array): array \/\/ \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430join(arr: array, delimiter: string): string \/\/ \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043cround(v: float): int \/\/ \u043e\u043a\u0440\u0443\u0433\u043b\u0438\u0442\u044c \u0434\u043e \u0446\u0435\u043b\u043e\u0433\u043eodd(v: int): bool \/\/ \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0447\u0451\u0442\u043d\u043e\u0435?even(v: int): bool \/\/ \u0447\u0438\u0441\u043b\u043e \u0447\u0451\u0442\u043d\u043e\u0435?divisibleBy(v: int, divider: int): bool \/\/ \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 divider?max(arr: array&lt;T&gt;): T \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435min(arr: array&lt;T&gt;): T \/\/ \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435int(s: string): int \/\/ \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043efloat(s: string): float \/\/ \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 floatdefault(var: variable, val: T): T \/\/ \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044eexists(varName: string): bool \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439existsIn(obj: object, varName: string): bool \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435isString(v: T): bool \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0430?isArray(v: T): bool \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432?includesHello, {{ userName }}## set userName=&#187;John&#187;## include &#171;greeter.j2&#8243;\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0434\u043b\u044f Inja \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b:\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439error(message: string) \/\/ \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438fromBase64(base64: string): string \/\/ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 base64toBase64(text: string): string \/\/ \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 base64fromJson(json: string): json \/\/ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JsontoJson(value: any, indent: int?): string \/\/ \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Jsonsh(stdin: string?, command: string): string \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 sh \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435split(text: string, delimiter: string): string \/\/ \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0435toBool(value: any): boolean \/\/ \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0432 booltrim(text: string): string \/\/ \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u043f\u043e \u043a\u0440\u0430\u044f\u043ccenter(text: string, width: int = 80): string \/\/ \u043e\u0442\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u0435indent(text: string, width: int | string, first: boolean = false, blank: boolean = false): string \/\/ \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0432\u0430 \u043e\u0442\u0441\u0442\u0443\u043f\u044b\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e sh, \u043e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0432\u0430\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0430 bash \u0435\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0432 \u0447\u0451\u043c-\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438:{{ sh(&#171;hostname&#187;) }}{{ sh(&#171;uuidgen&#187;) | replace(&#171;-&#171;, &#171;&#187;) }}{{ &#171;Hello John!&#187; | sh(&#171;sed &#8216;s\/John\/Mary\/'&#187;) }}\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Jinja2 (MR \u0432 Inja &#8212; https:\/\/github.com\/pantor\/inja\/pull\/334){% macro greeter(name, greeting=&#187;Hello&#187;) %}{{ greeting }}, {{ name }}!{% endmacro -%}{{ greeter(USER) }}{{ greeter(&#171;World&#187;, &#171;Hi&#187;) }}{{ greeter(&#171;World&#187;, &#171;Hi&#187;) }}\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Jinja2 (MR \u0432 Inja &#8212; https:\/\/github.com\/pantor\/inja\/pull\/336). \u0424\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 replace, uppercase \u0438 \u0442.\u0434, \u043d\u0430 \u0447\u0442\u043e \u0445\u0432\u0430\u0442\u0438\u0442 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438: ## filter indent(&#171;\/\/ &#171;, true)line1line2## endfilter\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 pipe \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e &#171;|&#187;. \u042d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 MR \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442 \u0432 Inja \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 3.5:&#187;A,B,C&#187; | split(&#171;,&#187;) | join(&#171;;&#187;)\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 &#171;mu &#8212; \u03bc&#187; \u0443\u0436\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043c\u0438\u043a\u0440\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0430 \u043d\u0435 mustache.\u041c\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u043e \u0432\u0441\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u044d\u0442\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043a\u043e\u0439. \u041e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0447\u0442\u043e \u043a\u043e\u043c\u0443-\u0442\u043e \u0435\u0449\u0451 \u043e\u043d\u0430 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u0412 \u043f\u043b\u0430\u043d\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0444\u0438\u0447 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435:\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sh \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b \u043d\u0430 \u0432\u0445\u043e\u0434\u0435, \u0444\u0430\u0439\u043b\u044b \u0441 JSON \u0438\u043b\u0438 YAML \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0434 Mac \u0438 Windows. \u041d\u043e \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1041580\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481755","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481755"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481755\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}