<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Some stuff (Записи о linux)</title><link>https://psss.site/</link><description></description><atom:link href="https://psss.site/categories/linux.xml" rel="self" type="application/rss+xml"></atom:link><language>ru</language><copyright>Contents © 2026 &lt;a href="mailto:none@example.com"&gt;None&lt;/a&gt; 
&lt;br/&gt;
Все материалы доступны как &lt;a rel="license" href="http://creativecommons.org/publicdomain/zero/1.0/"&gt;
общественное достояние CC0 1.0 Universal (CC0 1.0) Public Domain Dedication&lt;/a&gt;.
</copyright><lastBuildDate>Sat, 10 Oct 2026 15:26:38 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Linux автологин</title><link>https://psss.site/posts/linux-console-autologin/</link><dc:creator>None</dc:creator><description>&lt;p&gt;Если речь идёт про консоль и система оборудована &lt;code&gt;systemd&lt;/code&gt;,
то надо добавить файл &lt;code&gt;/etc/systemd/system/getty@tty1.service.d/override.conf&lt;/code&gt; &lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;-/sbin/agetty --autologin UserName --noclear %I 38400 linux&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ещё информация: 
&lt;a href="https://linuxvox.com/blog/linux-autologin/"&gt;https://linuxvox.com/blog/linux-autologin/&lt;/a&gt;&lt;/p&gt;</description><category>linux</category><guid>https://psss.site/posts/linux-console-autologin/</guid><pubDate>Thu, 24 Sep 2026 11:09:24 GMT</pubDate></item><item><title>bash: условие если вывод команды содержит строку</title><link>https://psss.site/posts/bash-if-grep/</link><dc:creator>None</dc:creator><description>&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SomeCommand&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'TextToFind'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TextToFind was found in SomeCommand output"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No TextToFind in SomeCommand output found"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>bash</category><category>linux</category><guid>https://psss.site/posts/bash-if-grep/</guid><pubDate>Thu, 24 Sep 2026 10:21:03 GMT</pubDate></item><item><title>bash: запуск процессов на фоне</title><link>https://psss.site/posts/bash-detach/</link><dc:creator>None</dc:creator><description>&lt;p&gt;Если надо запустить скрипт на фоне 
(типовая ситуация - запуск скрипта как CGI из веб-сервера),
то перед запуском долгого процесса надо отсоединить
stdout и stderr от скрипта. Тогда веб-сервер сможет
продолжать работать.&lt;/p&gt;
&lt;p&gt;Делается это так (перед запуском фоновой задачи):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;-
&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;-
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Источники:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/6033780/run-a-cgi-shell-script-in-background"&gt;https://stackoverflow.com/questions/6033780/run-a-cgi-shell-script-in-background&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://tldp.org/LDP/abs/html/io-redirection.html"&gt;https://tldp.org/LDP/abs/html/io-redirection.html&lt;/a&gt;&lt;/p&gt;</description><category>bash</category><category>linux</category><guid>https://psss.site/posts/bash-detach/</guid><pubDate>Thu, 24 Sep 2026 10:17:16 GMT</pubDate></item><item><title>Настройка nginx для вызова скриптов через CGI</title><link>https://psss.site/posts/nginx_cgi/</link><dc:creator>None</dc:creator><description>&lt;p&gt;&lt;code&gt;nginx&lt;/code&gt; будет работать через FastCGI c сервером
&lt;code&gt;fcgiwrap&lt;/code&gt;, который и будет запускать скрипты через CGI.&lt;/p&gt;
&lt;h3&gt;Установка и настройка&lt;/h3&gt;
&lt;p&gt;Дальнейшие действия следует производить от имени &lt;em&gt;root&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Установить серверы:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;nginx-full&lt;span class="w"&gt; &lt;/span&gt;fcgiwrap
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Создать файл конфигурации &lt;code&gt;/etc/nginx/fcgiwrap.conf&lt;/code&gt; для &lt;code&gt;nginx&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cgi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;fastcgi_pass&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fcgiwrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;fastcgi_param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCRIPT_FILENAME&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;document_root&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Создать каталог для cgi-скриптов:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cgi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;
&lt;span class="n"&gt;chmod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;755&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cgi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Добавить в файл конфигурации &lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt;
строку &lt;code&gt;include fcgiwrap.conf;&lt;/code&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;        &lt;/span&gt;.....
&lt;span class="w"&gt;        &lt;/span&gt;.....
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fcgiwrap&lt;/span&gt;.&lt;span class="nv"&gt;conf&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
}
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Включить &lt;code&gt;fcgiwrap&lt;/code&gt; и перезапустить &lt;code&gt;nginx&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl enable fcgiwrap
systemctl restart nginx
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Проверка&lt;/h3&gt;
&lt;p&gt;Создать тестовый файл &lt;code&gt;/var/www/cgi-bin/index.cgi&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Content-type: text/html&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;html&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;body&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;div style=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;width: 100%; font-size: 40px; font-weight: bold; text-align: center;&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"CGI Script Test Page"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;/div&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Сделать файл исполняемым&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;705&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/var/www/cgi-bin/index.cgi
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Проверить можно по ссылке вида &lt;strong&gt;http://servername/cgi-bin/index.cgi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Скрипт не обязательно должен быть на &lt;code&gt;python&lt;/code&gt;, можно использовать &lt;code&gt;bash&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Content-type: text/html\r\n"&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\r\n"&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;html&amp;gt;\n&amp;lt;body&amp;gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;div style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\"&amp;gt;"&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CGI Script Test Page"&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;/div&amp;gt;\n"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;whoami&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\r\n"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Источник: &lt;a href="https://www.server-world.info/en/note?os=Debian_11&amp;amp;p=nginx&amp;amp;f=8"&gt;https://www.server-world.info/en/note?os=Debian_11&amp;amp;p=nginx&amp;amp;f=8&lt;/a&gt;&lt;/p&gt;</description><category>linux</category><guid>https://psss.site/posts/nginx_cgi/</guid><pubDate>Wed, 15 Jul 2026 13:48:21 GMT</pubDate></item><item><title>Преобразовать svg в pdf</title><link>https://psss.site/posts/svg2pdf/</link><dc:creator>None</dc:creator><description>&lt;h2&gt;Преобразовать SVG в PDF&lt;/h2&gt;
&lt;p&gt;Преобразовать &lt;em&gt;svg&lt;/em&gt; файл в &lt;em&gt;pdf&lt;/em&gt; можно при помощи
программы &lt;code&gt;rsvg-convert&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Для установки её в Debian:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;apt install librsvg2-bin
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Для Windows всё немного сложнее, понадобится &lt;a href="https://github.com/msys2/msys2-installer/releases"&gt;MSYS&lt;/a&gt;.
В его терминале выполнить:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pacman -S mingw-w64-ucrt-x86_64-librsvg
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Обрезать PDF&lt;/h2&gt;
&lt;h3&gt;Вариант 1. pdfcropmargins&lt;/h3&gt;
&lt;p&gt;Установить можно через &lt;code&gt;pip3&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pip3 install pdfCropMargins --upgrade --only-binary pymupdf
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Вариант 2. pdfcrop&lt;/h3&gt;
&lt;p&gt;Для обрезки pdf-файлов можно использовать &lt;code&gt;pdfcrop&lt;/code&gt; из состава &lt;em&gt;TeXLive&lt;/em&gt;.
Под Windows надо установить &lt;em&gt;TeXLive&lt;/em&gt;, для Debian можно только часть (но зависимостей будет много):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;apt install texlive-extra-utils
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Скрипт для преобразования всех SVG файлов в каталоге&lt;/h2&gt;
&lt;h3&gt;При использовании &lt;code&gt;pdfcropmargins&lt;/code&gt;:&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;*.pdf
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.svg
&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$v&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;FNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;rsvg-convert&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;pdf&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FNAME&lt;/span&gt;&lt;span class="s2"&gt;.pdf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$v&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;pdfcropmargins&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-p4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FNAME&lt;/span&gt;&lt;span class="s2"&gt;.pdf"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;При использовании &lt;code&gt;pdfcrop&lt;/code&gt;:&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;*.pdf
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.svg
&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$v&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;FNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;rsvg-convert&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;pdf&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FNAME&lt;/span&gt;&lt;span class="s2"&gt;.pdf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$v&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;pdfcrop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FNAME&lt;/span&gt;&lt;span class="s2"&gt;.pdf"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;bat-файл для Windows для преобразования одного файла:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;echo&lt;/span&gt; off

&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;: FNAME=имя файла без расширения&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;FNAME&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;%~n1&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;RSVG_PATH&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;C:\msys2\ucrt64\bin

&lt;span class="nv"&gt;%RSVG_PATH%&lt;/span&gt;\rsvg-convert.exe -f pdf -o &lt;span class="nv"&gt;%FNAME%&lt;/span&gt;.pdf &lt;span class="nv"&gt;%FNAME%&lt;/span&gt;.svg

pdfcropmargins -p 0 -p4 0 0 0 0 -A &lt;span class="nv"&gt;%FNAME%&lt;/span&gt;.pdf
&lt;/pre&gt;&lt;/div&gt;</description><category>linux</category><category>misc</category><guid>https://psss.site/posts/svg2pdf/</guid><pubDate>Sun, 12 Jul 2026 08:40:31 GMT</pubDate></item><item><title>Функции в bash</title><link>https://psss.site/posts/bash-functions/</link><dc:creator>None</dc:creator><description>&lt;h3&gt;Задать функцию&lt;/h3&gt;
&lt;p&gt;Функции в bash можно задавать двумя способами:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Способ 1&lt;/span&gt;
function_name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;commands
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Способ 2&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;function_name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;commands
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Простые функции можно объявлять в одну строку.
При этом пробелы между 
фигурными скобками и телом функции важны!.
И последним в теле должен быть &lt;code&gt;;&lt;/code&gt; (точка с запятой).&lt;/p&gt;
&lt;p&gt;Объявление функций в одну строку:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Способ 1&lt;/span&gt;
function_name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;commands&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Способ 2&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;function_name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;commands&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Итого по объявлению функций:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Тело функций (всё что между фигурными скобками) должно отделяться от самих фигурных скобок
переносом строки или пробелами;&lt;/li&gt;
&lt;li&gt;Определение функции не вызывает её (как и в нормальных языках);&lt;/li&gt;
&lt;li&gt;Определение функции должно быть выше чем её вызовы;&lt;/li&gt;
&lt;li&gt;Тело однострочных функций должно заканчиваться &lt;code&gt;;&lt;/code&gt; (точкой с запятой).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Переменные&lt;/h3&gt;
&lt;p&gt;Глобальные переменные видны в функциях и могут быть модифицированы в функциях.
Локальные переменные (область видимости внутри функции) должны объявляться
с ключевым словом &lt;code&gt;local&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Локальные переменные имеют приоритет над глобальными если используется одно
и то же имя.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;var1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;
&lt;span class="nv"&gt;var2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'B'&lt;/span&gt;

my_function&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'C'&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;var2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'D'&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Inside function: var1: &lt;/span&gt;&lt;span class="nv"&gt;$var1&lt;/span&gt;&lt;span class="s2"&gt;, var2: &lt;/span&gt;&lt;span class="nv"&gt;$var2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Before executing function: var1: &lt;/span&gt;&lt;span class="nv"&gt;$var1&lt;/span&gt;&lt;span class="s2"&gt;, var2: &lt;/span&gt;&lt;span class="nv"&gt;$var2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

my_function

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"After executing function: var1: &lt;/span&gt;&lt;span class="nv"&gt;$var1&lt;/span&gt;&lt;span class="s2"&gt;, var2: &lt;/span&gt;&lt;span class="nv"&gt;$var2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Вывод этого скрипта:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;Before&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;executing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;
&lt;span class="n"&gt;Inside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;
&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;executing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Параметры&lt;/h3&gt;
&lt;p&gt;Чтобы передать параметры в функцию надо просто написать их после вызова,
разделяя пробелами. 
Имеет смысл заключать их в кавычки, тогда можно передавать параметры
с пробелами.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Внутри функции доступ к параметрам осуществляется через переменные
&lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, &lt;code&gt;$3&lt;/code&gt; и т.д.&lt;/li&gt;
&lt;li&gt;Переменная &lt;code&gt;$0&lt;/code&gt; содержит имя самой функции.&lt;/li&gt;
&lt;li&gt;Переменная &lt;code&gt;$#&lt;/code&gt; содержит количество переданных параметров.&lt;/li&gt;
&lt;li&gt;Переменные &lt;code&gt;$*&lt;/code&gt; и &lt;code&gt;$@&lt;/code&gt; содержать все парамеры, переданные функцию.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Отличия переменных &lt;code&gt;$*&lt;/code&gt; и &lt;code&gt;$@&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Если эти переменные НЕ заключать в кавычки, то они эквивалентны;&lt;/li&gt;
&lt;li&gt;В кавычках &lt;code&gt;"$*"&lt;/code&gt; раскрывается в одну строку &lt;code&gt;"$1 $2 ... $n"&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;В кавычках &lt;code&gt;"$@"&lt;/code&gt; раскрывается в разные строки &lt;code&gt;"$1" "$2" ... "$n"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

greeting&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

greeting&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"World"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Возвращаемые значения&lt;/h3&gt;
&lt;p&gt;В отличие от функций в "настоящих" языках программирования, 
функции в Bash не позволяют возвращать значения как это принято. 
Когда функция bash заканчивает выполнение, ее возвращаемое значение
это статус последней выполненной команды в теле функции, 
обычно 0 при успешном завершении, число 1-255 код ошибки.&lt;/p&gt;
&lt;p&gt;Это число можно указать явно при использовании команды &lt;code&gt;return&lt;/code&gt;, 
после чего оно будет сохранено в специальной переменной &lt;code&gt;$?&lt;/code&gt;. 
Команда &lt;code&gt;return&lt;/code&gt; прерывает выполнение функции (как и в обычных языках),
а код ошибки можно рассматривать как статус выполнения. &lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

my_function&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"some result"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;55&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

my_function
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Вывод этого скрипта:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;some result
55
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Чтобы по-настоящему что-то вернуть из функции надо использовать что-то другое.
Самый простой вариант - присвоить что-то глобальной переменной:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

my_function&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;func_result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"some result"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

my_function
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$func_result&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Вывод этого скрипта:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;some result
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Есть способ получше. Отправить требуемое возвращаемое значение
на вывод (при помощи &lt;code&gt;echo&lt;/code&gt; или &lt;code&gt;printf&lt;/code&gt;, например):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

my_function&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;func_result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"some result"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$func_result&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;func_result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;my_function&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$func_result&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Вывод этого скрипта:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;some result
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Тут вместо простого вызова (который просто напечатает строку)
вызов функции "оборачивается" в оператор &lt;code&gt;$(...)&lt;/code&gt;, после чего
переменная будет содержать то, что функция "хотела" напечатать.&lt;/p&gt;
&lt;h3&gt;Переопределение команд&lt;/h3&gt;
&lt;p&gt;Можно сделать функцию с именем, таким же как существующая команда.
В этом случае, вместо команды будет вызываться функция.
так можно добавлять, например, дополнительные опции во все вызовы
команд сразу, или ещё как-то шаманить, чтоб не править много мест 
в скрипте сразу.&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c1"&gt;#overriding command&lt;/span&gt;
echo&lt;span class="o"&gt;(){&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;builtin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The name is : &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edward III"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Вывод этого скрипта:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;The name is : Edward III
&lt;/pre&gt;&lt;/div&gt;</description><category>bash</category><category>linux</category><guid>https://psss.site/posts/bash-functions/</guid><pubDate>Thu, 09 Oct 2025 10:42:46 GMT</pubDate></item><item><title>SSH через прокси</title><link>https://psss.site/posts/ssh-proxy/</link><dc:creator>None</dc:creator><description>&lt;p&gt;Для работы &lt;code&gt;ssh&lt;/code&gt; через прокси используется может использоваться ряд
программ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connect&lt;/li&gt;
&lt;li&gt;corkscrew&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/proxytunnel/proxytunnel"&gt;proxytunnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для того, чтобы подключаться через прокси ко всем или выборочным
серверам надо прописать в файле &lt;code&gt;config&lt;/code&gt; (&lt;code&gt;~/.ssh/config&lt;/code&gt;)
соответствующие настройки. Там можно настроить и другие параметры:
имя пользователя, порт и т. п.&lt;/p&gt;
&lt;p&gt;Работает и под Windows тоже (&lt;code&gt;proxytunnel&lt;/code&gt; уж точно):&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# для примера: ip-адрес прокси 1.1.1.1 порт 8080&lt;/span&gt;

&lt;span class="na"&gt;Host имя_хоста1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;ProxyCommand connect -H 1.1.1.1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;8080 %h %p&lt;/span&gt;

&lt;span class="na"&gt;Host имя_хоста2&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;ProxyCommand corkscrew 1.1.1.1 8080 %h %p&lt;/span&gt;

&lt;span class="na"&gt;Host имя_хоста3&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;ProxyCommand proxytunnel -q -p 1.1.1.1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;8080 -d %h:%p -H "User-Agent: Mozilla/4.0 (compatible&lt;/span&gt;&lt;span class="c1"&gt;; MSIE 6.0; Win32)"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;PuTTY&lt;/h3&gt;
&lt;p&gt;PuTTY умеет работать через прокси. Для этого в настройках подключения
есть отдельная вкладка &lt;em&gt;Proxy&lt;/em&gt;. Если нужно для проксирования вызвать внешнюю 
команду (например, тот же &lt;code&gt;proxytunnel&lt;/code&gt;), то это можно сделать,
указав в &lt;em&gt;Proxy type&lt;/em&gt; не традиционные SOCKS или HTTP, а
&lt;code&gt;local (run subprogram to connect)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;А в поле &lt;em&gt;Command...&lt;/em&gt; вписать строку, аналогичную настройкам ssh:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nt"&gt;proxytunnel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;8080&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="o"&gt;:%&lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-H&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="PuTTY via local proxy" src="https://psss.site/images/putty-proxytunnel.png"&gt;&lt;/p&gt;</description><category>linux</category><category>ssh</category><guid>https://psss.site/posts/ssh-proxy/</guid><pubDate>Fri, 19 Sep 2025 10:23:36 GMT</pubDate></item><item><title>QEMU run</title><link>https://psss.site/posts/qemu-run/</link><dc:creator>None</dc:creator><description>&lt;p&gt;Скрипт для запуска qemu с типовыми ключами (и образом CD в качестве 
опционального параметра).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c1"&gt;# Имя файла образа жесткого диска&lt;/span&gt;
&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./img/main_disk.img

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OSTYPE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linux-gnu"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;tmp
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;CMDLINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;qemu-system-x86_64
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-cpu qemu64 -enable-kvm -cpu host -hdb fat:rw:./tmp"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;CMDLINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;qemu-system-x86_64
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-cpu qemu64"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-gt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"external iso as cdrom &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;CDROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-cdrom&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-boot&lt;span class="w"&gt; &lt;/span&gt;d
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="nv"&gt;CDROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nv"&gt;$CMDLINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-hda&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$IMG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;$CDROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OPTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8192&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-vga&lt;span class="w"&gt; &lt;/span&gt;cirrus&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-net&lt;span class="w"&gt; &lt;/span&gt;nic,model&lt;span class="o"&gt;=&lt;/span&gt;rtl8139&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-net&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-usbdevice&lt;span class="w"&gt; &lt;/span&gt;tablet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-vga&lt;span class="w"&gt; &lt;/span&gt;virtio
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Для начального создания образа диска можно использовать:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;qemu-img&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;qcow2&lt;span class="w"&gt; &lt;/span&gt;main_disk.img&lt;span class="w"&gt; &lt;/span&gt;20G
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Если надо упаковать каталог &lt;code&gt;tmp&lt;/code&gt; в iso-образ, например,
чтобы подсунуть в качестве cdrom при запуске &lt;code&gt;qemu&lt;/code&gt;, то сделать можно так:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;mkisofs&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;-J&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;dat.iso&lt;span class="w"&gt; &lt;/span&gt;tmp/*
&lt;/pre&gt;&lt;/div&gt;</description><category>linux</category><category>misc</category><category>windows</category><guid>https://psss.site/posts/qemu-run/</guid><pubDate>Tue, 10 Jun 2025 12:52:29 GMT</pubDate></item><item><title>Debian: работа со временем</title><link>https://psss.site/posts/debian-time/</link><dc:creator>None</dc:creator><description>&lt;h3&gt;Использование systemd-timesync&lt;/h3&gt;
&lt;h4&gt;Запуск службы&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;systemd-timesyncd.service
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Установка времени по локальному, а не по UTC&lt;/h4&gt;
&lt;p&gt;Актуально если есть dual-boot с windows, чтоб при каждой
перезагрузке не переставлять время.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-local-rtc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Настройка сервера для синхронизации&lt;/h4&gt;
&lt;p&gt;Файл настроек расположен тут: &lt;code&gt;/etc/systemd/timesyncd.conf&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;Установка даты вручную&lt;/h4&gt;
&lt;p&gt;Остановить службу синхронизации и выставить время:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;systemd-timesyncd
timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-ntp&lt;span class="w"&gt; &lt;/span&gt;no
timedatectl&lt;span class="w"&gt; &lt;/span&gt;set-time&lt;span class="w"&gt; &lt;/span&gt;YYYY-MM-DD
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Когда соответственно, чтоб включить - всё тоже самое, нов обратном порядке.&lt;/p&gt;
&lt;h4&gt;Синхронизировать аппаратные часы с системными&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;hwclock&lt;span class="w"&gt; &lt;/span&gt;--systohc&lt;span class="w"&gt; &lt;/span&gt;--localtime
&lt;/pre&gt;&lt;/div&gt;</description><category>linux</category><guid>https://psss.site/posts/debian-time/</guid><pubDate>Wed, 29 Nov 2023 10:04:07 GMT</pubDate></item><item><title>Linux wine edit PATH</title><link>https://psss.site/posts/linux-wine-path/</link><dc:creator>None</dc:creator><description>&lt;p&gt;Если надо поменять системные пути &lt;code&gt;PATH&lt;/code&gt;
внутри окружения &lt;em&gt;wine&lt;/em&gt;, то это можно
сделать либо через вызов &lt;code&gt;regedit&lt;/code&gt;
и найти там параметр&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Реально эта ветвь реестра хранится в файле &lt;code&gt;~/.wine/system.reg&lt;/code&gt;
и можно этот обычный текстовый файл отредактировать.&lt;/p&gt;
&lt;p&gt;Там есть раздел:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;[System\\CurrentControlSet\\Control\\Session Manager\\Environment]
&lt;/pre&gt;&lt;/div&gt;</description><category>linux</category><guid>https://psss.site/posts/linux-wine-path/</guid><pubDate>Wed, 29 Nov 2023 10:00:14 GMT</pubDate></item></channel></rss>