Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия | |||
— | bash [2025/07/06 12:38] (текущий) – внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Руководство BASH ====== | ||
+ | ~~Title: Основы BASH скрипты, | ||
+ | {{htmlmetatags> | ||
+ | metatag-description=(Руководство Bash введение в оболочку, | ||
+ | }} | ||
+ | {{ :: | ||
+ | **bash** (Bourne again [[shell]]) - усовершенствованная и модернизированная вариация командной оболочки Bourne shell ([[sh|sh]]). | ||
+ | |||
+ | ===== Горячие клавиши Bash (hotkeys bash) ===== | ||
+ | Таблица комбинаций клавиш консоли Bash (терминала Linux). | ||
+ | * ctrl+d выйти из терминала | ||
+ | * ctrl+l очистить экран, аналог команды clear. | ||
+ | * ctrl+a переместить курсор в начало строки | ||
+ | * ctrl+e переместить курсор в конец строки | ||
+ | * ctrl+u удалить все символы от курсора до начала строки | ||
+ | * ctrl+k удалить все символы от курсора до конца строки | ||
+ | * ctrl+w удалить слово перед курсором | ||
+ | * ctrl+b переместить курсор на один символ влево | ||
+ | * ctrl+f переместить курсор на один символ вправо | ||
+ | * ctrl+t поменять местами символ слева от курсора и под курсором | ||
+ | * ctrl+h удалить символ слева от курсора | ||
+ | * ctrl+p предыдущая команда в истории bash | ||
+ | * ctrl+n следующая команда в истории bash | ||
+ | * ctrl+r реверсивный поиск команд в истории bash | ||
+ | * ctrl+y вставляет последнюю удалённую с помощью ctrl+u или ctrl+k строку | ||
+ | * ctrl+m выполнение команды, | ||
+ | * ctrl+o выполняет команду, | ||
+ | * Tab+Tab выводит список команд. При наличии какого нибудь символа(-ов) выводит команды по введённым символам. | ||
+ | * ctrl+c отменить последнюю введённую команду | ||
+ | * ctrl+x+v показать версию bash | ||
+ | * ctrl+s стоп режим. Блокирует вывод на консоль. При этом все данные отображённые на экране остаются неизменными. | ||
+ | * ctrl+q выход из стоп-режима | ||
+ | |||
+ | ==== Конфигурационные файлы инициализации Bash ==== | ||
+ | |||
+ | Когда Bash вызывается как интерактивная оболочка, | ||
+ | |||
+ | **Синтаксис**. | ||
+ | * **Оператор точка** позволяет включать код находящийся в другом файле (после точки и перед именем загружаемого файла ставится пробел). Этот оператор часто используют для включения конфигурационных параметров, | ||
+ | * **Двойные кавычки** - экранирует пробелы в значении переменных, | ||
+ | * **Одинарные кавычки** экранируют все специальные символы. Т.е. символ $ в **echo '$sym ' | ||
+ | * **Обратные одинарные кавычки ``** служат для подстановки данных. В том месте где будет использована подстановка, | ||
+ | `date` | ||
+ | $(date) | ||
+ | </ | ||
+ | * **Символ ;** Оболочка bash допускает последовательное выполнение команд - одна за другой. Для этого серия команд вводится одной строкой, | ||
+ | $ cd ~; ls *.txt; cp *.txt $HOME/temp/ | ||
+ | </ | ||
+ | * **Свойства переменных** в shell script: | ||
+ | * не типизированы (значения в переменных считаются строками, | ||
+ | * область видимости переменных - весь код программы (если переменная будет определена в функции, | ||
+ | * при обращении к неопределенной переменной не выдаются ошибки, | ||
+ | * регистрозависимые. | ||
+ | * **echo и метасимволы в bash**. Для использования метасимволов \n (перевод на новую строку), | ||
+ | #!/bin/bash | ||
+ | |||
+ | echo -e \\n\\tfirst | ||
+ | echo $' | ||
+ | </ | ||
+ | ===== Настройка переменных среды bash ===== | ||
+ | <note important> | ||
+ | |||
+ | * [[openvz?&# | ||
+ | * Вывести переменные окружения.< | ||
+ | $ env | more | ||
+ | SSH_AGENT_PID=1326 | ||
+ | TERM=xterm | ||
+ | SHELL=/ | ||
+ | ... | ||
+ | $ echo $PATH | ||
+ | / | ||
+ | </ | ||
+ | * **export** - добавить переменную окружения pp=1. С помощью команды export присваивается переменной окружения определённое значение. Если переменная не существует, | ||
+ | # export pp=1 | ||
+ | </ | ||
+ | * unset - удалить переменную окружения pp< | ||
+ | # unset pp | ||
+ | </ | ||
+ | $ export PATH=$PATH:/ | ||
+ | </ | ||
+ | * Временно изменить редактор по умолчанию vi на nano< | ||
+ | # export EDITOR=nano | ||
+ | </ | ||
+ | # nano .bashrc | ||
+ | |||
+ | # set default editor nano | ||
+ | export EDITOR=" | ||
+ | # OR | ||
+ | # set default editor vi | ||
+ | #export EDITOR=" | ||
+ | </ | ||
+ | ===== .bash_aliases ===== | ||
+ | * Примеры для .bash_aliases< | ||
+ | $ nano $HOME/ | ||
+ | </ | ||
+ | $ source $HOME/ | ||
+ | </ | ||
+ | * Навигация< | ||
+ | alias ..='cd ..' | ||
+ | alias ...=' | ||
+ | alias cdt=' | ||
+ | </ | ||
+ | ===== Как очистить историю команд в bash ===== | ||
+ | Чтобы очистить историю команд в Bash, вы можете использовать следующие шаги: | ||
+ | <file bash> | ||
+ | cat /dev/null > ~/ | ||
+ | или | ||
+ | rm ~/ | ||
+ | |||
+ | history -cw | ||
+ | </ | ||
+ | |||
+ | * -c - Очистить файл истории | ||
+ | * -w - Внести команды текущей сессии в файл с историей | ||
+ | * d - Удалить строку с указанным номером из истории <file bash> | ||
+ | history -dw 352 | ||
+ | </ | ||
+ | * Выполнить команду не занося ее в историю Bash <file bash> | ||
+ | $ < | ||
+ | </ | ||
+ | - **Очистить текущую сессию истории**: | ||
+ | - **Удалить файл истории**: | ||
+ | - **Ограничение хранения истории**: | ||
+ | |||
+ | После внесения изменений, | ||
+ | <file bash> | ||
+ | source ~/.bashrc | ||
+ | </ | ||
+ | ===== Цветной терминал (консоль) в Linux ===== | ||
+ | |||
+ | В Debian 8 достаточно для root раскоментировать строки в / | ||
+ | # You may uncomment the following lines if you want `ls' to be colorized: | ||
+ | export LS_OPTIONS=' | ||
+ | eval " | ||
+ | alias ls='ls $LS_OPTIONS' | ||
+ | alias ll='ls $LS_OPTIONS -l' | ||
+ | alias l='ls $LS_OPTIONS -lA' | ||
+ | </ | ||
+ | |||
+ | ====== Позиционные переменные (параметры запуска скрипта) ====== | ||
+ | При вызове команды или сценария с аргументами, | ||
+ | * $0 ... $9 - при запуске допускается не более 9 параметров передавать в скрипт. Переменная $0 является именем скрипта и путь к скрипту. Для получения только имени скрипта смотрите код ниже: | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | echo | ||
+ | echo "# arguments called with ----> | ||
+ | echo "# \$1 ----------------------> | ||
+ | echo "# \$2 ----------------------> | ||
+ | echo "# path to me ---------------> | ||
+ | echo "# parent path --------------> | ||
+ | echo "# my name ------------------> | ||
+ | echo | ||
+ | exit | ||
+ | </ | ||
+ | * **$#** - количество параметров переданных скрипту | ||
+ | * **$?** - код возврата программы. **echo $?** - вывести ошибку с которой закончил выполняться предыдущий скрипт (программа), | ||
+ | test " | ||
+ | </ | ||
+ | * **$* и $@** - все параметры командной строки. **echo $*** - выведет все значения параметров. | ||
+ | * **$!** - PID программы, | ||
+ | * **$$** - PID процесса shell. | ||
+ | |||
+ | |||
+ | |||
+ | ====== Отладка скриптов bash ====== | ||
+ | |||
+ | Для отладки скриптов bash можно использовать встроенный набор команд. Можно включать и выключать режим отладки используя следующие команды внутри скрипта: | ||
+ | * set -x - (set -o xtrace) показывать команды и параметры, | ||
+ | * set -v - (set -o verbose) печатает входные строки сразу по мере их считывания; | ||
+ | * set -f - (set -o noglob) отключается генерация имени файла с помощью метасимволов (подстановка). | ||
+ | В одном и том же скрипте вы можете включать и выключать отладочный режим столько раз, сколько это необходимо. Символ " | ||
+ | |||
+ | **Пример**. Отладка прервется после первого выполнения цикла, что будет видно в результате выполнения этого скрипта. | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | clear | ||
+ | |||
+ | # включаем режим отладки | ||
+ | set -x | ||
+ | for i in 0 1 2 3 4 | ||
+ | do | ||
+ | echo " | ||
+ | # выключаем режим отладки | ||
+ | set +x | ||
+ | done | ||
+ | |||
+ | exit 0 | ||
+ | |||
+ | </ | ||
+ | ====== Массивы bash ====== | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | car=(bmw mers lada audi) | ||
+ | |||
+ | # вывести второй элемент массива | ||
+ | echo ${car[1]} | ||
+ | # вывести все элементы массива | ||
+ | echo ${car[*]} | ||
+ | </ | ||
+ | Вывести список директорий для бэкапа из массива bash: | ||
+ | <file bash> | ||
+ | BACKUP_LST=( | ||
+ | /etc | ||
+ | /root | ||
+ | /var/www) | ||
+ | |||
+ | for k in ${BACKUP_LST[*]}; | ||
+ | do | ||
+ | echo $k | ||
+ | done | ||
+ | </ | ||
+ | |||
+ | ====== Взаимодействие с пользователем ====== | ||
+ | ===== read ===== | ||
+ | При выполнении оператора read, на экране терминала появится курсор и пользователю даётся возможность ввести данные. Ввод завершается нажатием на кнопку " | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | |||
+ | echo -n ' | ||
+ | read | ||
+ | echo "Вы набрали - $REPLY" | ||
+ | </ | ||
+ | ===== select ===== | ||
+ | Команда select используется для создания интерактивного меню вашего скрипта. Синтаксис команды select (можно применять утилиту [[tput]]): | ||
+ | < | ||
+ | | ||
+ | do | ||
+ | | ||
+ | done | ||
+ | </ | ||
+ | Список слов, следующих за in, расширяется, | ||
+ | |||
+ | **Пример 1**. **~/.b*** выводится список файлов текущие директории начинающиеся на .b Из них формируется меню. | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | select file in ~/.b* quit | ||
+ | do | ||
+ | if [ -e $file ] | ||
+ | then | ||
+ | ls -l $file | ||
+ | else | ||
+ | break | ||
+ | fi | ||
+ | done | ||
+ | |||
+ | exit 0 | ||
+ | </ | ||
+ | **Пример 2** | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | options1=" | ||
+ | |||
+ | echo options1 $options1 | ||
+ | |||
+ | eval set $options1 | ||
+ | select opt in " | ||
+ | do | ||
+ | echo $opt | ||
+ | if [ " | ||
+ | exit | ||
+ | fi | ||
+ | done | ||
+ | </ | ||
+ | **Пример 3** | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | OPTIONS=" | ||
+ | | ||
+ | if [ " | ||
+ | echo done | ||
+ | exit | ||
+ | elif [ " | ||
+ | echo Hello World | ||
+ | echo `/bin/ls /` | ||
+ | else | ||
+ | clear | ||
+ | echo bad option | ||
+ | fi | ||
+ | done | ||
+ | </ | ||
+ | ====== Команда test ("[ ]") ====== | ||
+ | Команда **test** предназначена для проверки следующих типов условий: | ||
+ | - сравнение различных значений, | ||
+ | - проверка типов и наличия файлов, | ||
+ | - проверка логических условий (логическое И - "&&", | ||
+ | С использованием этой команды формируются операторы выбора и цикла языка [[shell]]. Два возможных формата команды:< | ||
+ | </ | ||
+ | </ | ||
+ | ^[ -e /путь к / файлу ]|- истина если файл существует| | ||
+ | ^[ -s /путь к / файлу ]|- истина если файл существует и имеет не нулевую длину| | ||
+ | ^[ -f /путь к / файлу ]|- истина если обычный файл существует| | ||
+ | ^[ -h /путь к / файлу ]|- истина если файл существует и является символической ссылкой| | ||
+ | ^[ -w /путь к / файлу ]|- истина если файл существует и и доступен для записи| | ||
+ | ^[ -z STRING ]|- истина, | ||
+ | ^[ -n STRING ] или [ STRING ]|- истина, | ||
+ | ^[ STRING1 == STRING2 ]|- истина, | ||
+ | ^[ STRING1 != STRING2 ]|- истина, | ||
+ | ^[ STRING1 < STRING2 ]|- истина, | ||
+ | ^[ STRING1 > STRING2 ]|- истина, | ||
+ | ^[ ARG1 OP ARG2 ]|" | ||
+ | |||
+ | |||
+ | * **Проверка логических условий**. Логическое И - "&&", | ||
+ | - Пример №1< | ||
+ | [ -f file ] && rm file | ||
+ | </ | ||
+ | - Пример №2< | ||
+ | [ -f file ] || touch file | ||
+ | </ | ||
+ | |||
+ | ====== if-then-else ====== | ||
+ | Набор управляющих операторов Bash включает в себя: | ||
+ | парным, | ||
+ | |||
+ | |||
+ | Элементарная конструкция if выглядит так: | ||
+ | <file bash> | ||
+ | if [ " | ||
+ | then | ||
+ | # выполнить если выражение вычислилось как истина | ||
+ | fi | ||
+ | </ | ||
+ | |||
+ | if проверяет код возврата выполнения программы: | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | pwd="/ | ||
+ | if rm $pwd/1.txt 2>/ | ||
+ | then | ||
+ | echo " | ||
+ | else | ||
+ | echo "not deleted" | ||
+ | fi | ||
+ | </ | ||
+ | Более короткая запись. < | ||
+ | </ | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | pwd="/ | ||
+ | |||
+ | [ -e $pwd/1.txt ] && (rm $pwd/1.txt; echo " | ||
+ | </ | ||
+ | * Пример.< | ||
+ | #!/bin/bash | ||
+ | |||
+ | CDIR=`pwd` | ||
+ | LDIR="/ | ||
+ | |||
+ | if !([ -h $LDIR ]); then | ||
+ | echo " | ||
+ | ln -s $CDIR $LDIR | ||
+ | # exit 0 | ||
+ | fi | ||
+ | </ | ||
+ | * Пример.< | ||
+ | if [[ " | ||
+ | then | ||
+ | # | ||
+ | fi #конец сравнения | ||
+ | |||
+ | if [[ " | ||
+ | then | ||
+ | # | ||
+ | fi #конец сравнения | ||
+ | </ | ||
+ | |||
+ | ====== Циклы bash ====== | ||
+ | В этом разделе поговорим об управляющих конструкциях оболочки bash, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for, while и until, о методах работы с ними и о практических примерах их применения. | ||
+ | ===== Цикл for in ===== | ||
+ | Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение в списке поочерёдно присваивается переменной. | ||
+ | Синтаксис следующий: | ||
+ | <file bash> | ||
+ | for переменная in [список_значений] | ||
+ | do | ||
+ | команды | ||
+ | done | ||
+ | |||
+ | for NAME [in LIST ]; do COMMANDS; done # синтаксис для записи цикла в одну строку | ||
+ | </ | ||
+ | < | ||
+ | for arg in [list] ; do | ||
+ | </ | ||
+ | Рассмотрим небольшой пример скрипта bash: | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | for i in 0 1 2 3 4 # переменной $i будем поочерёдно присваивать значения от 0 до 4 включительно | ||
+ | do | ||
+ | echo " | ||
+ | done #цикл окончен | ||
+ | exit 0 | ||
+ | </ | ||
+ | В переменную $i поочерёдно подставляются значения из списка и в цикле идёт работа со значением этой переменной. | ||
+ | |||
+ | < | ||
+ | |||
+ | * **Пример** получения данных из внешнего файла с фильтрацией содержимого файла. В нем сначала отбираются первые поля файла (разделение полей - пробел), | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | for i in `cat ipset.txt | cut -f1 -d ' ' | sed -e '/^#/ d'` | ||
+ | do | ||
+ | echo " | ||
+ | done | ||
+ | exit 0 | ||
+ | </ | ||
+ | * Пример генерации списка команд на выполнение: | ||
+ | <file bash> | ||
+ | for k in `find /tmp/ -type f`; do echo ls -l $k ; done | ||
+ | </ | ||
+ | * Пример поиска файлов с исключением | ||
+ | <file bash> | ||
+ | for k in `grep -R vhosts-includes /etc/nginx/ | cut -d : -f1`; do grep -w " | ||
+ | </ | ||
+ | ===== Цикл while do ===== | ||
+ | Цикл while сложнее цикла for-in и используется для повторения команд, | ||
+ | < | ||
+ | while выражение или команда возвращающая код возврата | ||
+ | do | ||
+ | команды | ||
+ | done | ||
+ | |||
+ | while CONTROL-COMMAND; | ||
+ | </ | ||
+ | |||
+ | Пример работы цикла рассмотрим на следующем примере: | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | again=yes # | ||
+ | while [ " | ||
+ | do | ||
+ | echo " | ||
+ | read name | ||
+ | echo "The name you entered is $name" | ||
+ | |||
+ | echo "Do you wish to continue?" | ||
+ | read again | ||
+ | done | ||
+ | echo " | ||
+ | </ | ||
+ | Цикл выполняется до тех пор, пока мы не введем что-то отличное от " | ||
+ | |||
+ | Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, | ||
+ | |||
+ | **Бесконечный цикл в bash при помощи while:** | ||
+ | |||
+ | < | ||
+ | #!/bin/bash | ||
+ | while true; do | ||
+ | echo " | ||
+ | done | ||
+ | </ | ||
+ | true — это тоже программа. Единственное, | ||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | while :; do | ||
+ | echo " | ||
+ | done | ||
+ | </ | ||
+ | Это позволяет добиться точно такого же эффекта, | ||
+ | ===== Цикл until do ===== | ||
+ | Цикл until используется для выполнения заданного набора команд до тех пор, пока данное условие оценивается как ложное. Условие оценивается перед выполнением команд. Если условие оценивается как ложное, | ||
+ | |||
+ | Оператор until применяет способом аналогичным приведенному выше while. Разница лишь в том, что условие работает наоборот. Цикл while выполняет до тех пор пока условие истинно. Цикл until — до тех пор пока условие не станет истинным. | ||
+ | |||
+ | Синтаксис <file bash> | ||
+ | until TEST-COMMAND; | ||
+ | </ | ||
+ | |||
+ | <file bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | counter=0 | ||
+ | |||
+ | until [ $counter -gt 5 ] | ||
+ | do | ||
+ | echo Counter: $counter | ||
+ | ((counter++)) | ||
+ | done | ||
+ | </ | ||
+ | ====== Оператор case ====== | ||
+ | Оператор case всегда завершается ключевым словом esac. | ||
+ | < | ||
+ | case строка in | ||
+ | шаблон) | ||
+ | список операторов | ||
+ | ;; | ||
+ | [ шаблон) | ||
+ | список операторов | ||
+ | [;;] ] | ||
+ | esac | ||
+ | </ | ||
+ | Оператор case поочерёдно сравнивает строку с шаблонами. Если шаблон совпадает, | ||
+ | |||
+ | |||
+ | ====== Пустой оператор ====== | ||
+ | Пустой оператор ":" | ||
+ | ====== Функции ====== | ||
+ | Функцию в shell можно определить двумя способами: | ||
+ | |||
+ | |||
+ | ====== eval ====== | ||
+ | < | ||
+ | eval arg1 [arg2] ... [argN] | ||
+ | </ | ||
+ | Транслирует список аргументов, | ||
+ | |||
+ | Пример. Демонстрация команды eval | ||
+ | |||
+ | < | ||
+ | #!/bin/bash | ||
+ | |||
+ | y=`eval ls -l` # Подобно y=`ls -l` | ||
+ | echo $y # но символы перевода строки не выводятся, | ||
+ | echo | ||
+ | echo " | ||
+ | |||
+ | echo; echo | ||
+ | |||
+ | y=`eval df` # Аналогично y=`df` | ||
+ | echo $y # но без символов перевода строки. | ||
+ | |||
+ | # Когда производится подавление вывода символов LF (перевод строки), | ||
+ | #+ результатов различными утилитами, | ||
+ | |||
+ | exit 0 | ||
+ | </ | ||
+ | ====== getopts ====== | ||
+ | getopts - это встроенная в shell команда, | ||
+ | ====== trap - обработка прерываний ====== | ||
+ | Команда trap позволяет переопределить стандартную реакцию программы на получаемые сигналы. Бывает необходимо защитить выполнение программы от прерывания. Формат команды trap:< | ||
+ | trap ' | ||
+ | </ | ||
+ | |||
+ | Наиболее часто приходится встречаться со следующими прерываниями, | ||
+ | < | ||
+ | 0 выход из интерпретатора, | ||
+ | 1 отбой (отключение удаленного абонента), | ||
+ | 2 прерывание от < | ||
+ | 9 уничтожение (не перехватывается), | ||
+ | 15 окончание выполнения. | ||
+ | </ | ||
+ | |||
+ | Например, | ||
+ | |||
+ | trap 'rm /tmp/* ; exit 1' 1 2 15 | ||
+ | |||
+ | которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлён выход " | ||
+ | |||
+ | Команда " | ||
+ | |||
+ | ( trap '' | ||
+ | |||
+ | |||
+ | ====== Примеры скриптов на Bash ====== | ||
+ | * [[telegram_api]] |
📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.
📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Nginx простые примеры конфигурации
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах
7 Самых Популярных Обзоров
- Хостинг для Python-скриптов и приложений
- ТОП 4 лучших антидетект браузеров (Бесплатные & Платные)
- Подборка купонов (промокоды) на хостинг, антидетект браузеры
- Обзор THE.Hosting (PQ Hosting): надежный хостинг с профессиональной поддержкой
- Хостинг в России
- Хостинг в Европе
- Обзор браузера Dolphin {anty} для мультиаккаунтинга