Типография «Новый формат»
Заметка «4. Termux: подготовка места. Bash: архивация директорий.» (страница 1 из 2)
Тип: Заметка
Раздел: ИИ-творчество
Темы: Зачемнадыии
Автор:
Оценка: 5 +5
Баллы: 2 +2
Читатели: 10 +10
Дата:

4. Termux: подготовка места. Bash: архивация директорий.

После установки Termux становится доступна командная строка Linux и язык оболочки (обычно Bash), который можно использовать в командной строке для администрирования, а также — создавать текстовые файлы-скрипты с командами и запускать их.
Теоретически, на Bash можно написать программу любой сложности, но язык этот изначально разрабатывался именно для командной строки, поэтому имеет в основном прикладное значение для задач автоматизации рутины и управления программами-утилитами Linux.

Этим мы и займёмся.

I

Песочница Термукс — ненадёжное место для хранения исходников программ, поэтому лучше всего хранить их в основной памяти телефона, вместе с другими файлами.
Тогда можно будет легко сохранять их копии на sd-card или в облаках.
При первом запуске Термукс создаёт песочницу — директорию:

 /data/data/com.termux/files 

Это и есть доступная пользователям файловая система Термукс, состоящая из двух директорий:

 
files/
    |__ usr/
    |__ home/
 

Директория  home  предназначена для файлов пользователя и  пользовательских настроек различных приложений;
Директория  usr  предназначена для общих команд/приложений/настроек Termux.

Эти директории — основные в Termux и их адреса находятся в системных переменных $HOME и $PREFIX:

Домашняя директория

 
$ $HOME
bash: /data/data/com.termux/files/home: Is a directory
 

Общие команды/приложения/библиотеки

 
$ $PREFIX
bash: /data/data/com.termux/files/usr: Is a directory
 

При открытии приложения, Термукс устанавливает $HOME текущей рабочей директорией.
Проверить это можно командами:

 
pwd
 

Вывод:  /data/data/com.termux/files/home 

или

 
echo "$PWD"
 

Вывод:  /data/data/com.termux/files/home 

А посмотреть основное содержимое этой директории можно так:

 
ls
 

 

II Доступ к общей памяти телефона (termux-setup-storage)

По умолчанию, в Термукс доступно только собственное изолированное пространство, но можно также дать Термукс доступ к файлам в общем хранилище телефона.
Для этого в командной строке Термукс нужно ввести команду:

 
termux-setup-storage
 

После этого в директории $HOME появится директория  storage , в которой будут находится ссылки на разные участки памяти устройства.
Можно представить это в виде схемы:

 
storage/
    |__ dcim/
    |__ external-1
    |__ music
    |__ shared
    |__ downloads
    |__ movies
    |__ pictures
 

Так реалиован доступ к фотографиям, музыке, скачанным файлам, видео и картинкам в основной памяти устройства.

Получить доступ ко всем папкам и файлам в основной памяти можно через папку-ссылку  shared , которая откроет содержимое директории:

 /storage/emulated/0 

А ссылка  external-1  — это память sd-cart, где Термукс создаёт собственное пространство, доступное с устройства без захода в Термукс, например:

 /storage/68F6-C4F3/Android/data/com.termux/files 

(В этом адресе цифры приведены для моего устройства — на другом устройстве они могут быть иными)

По этому адресу на флешке находится пустое место, предназначенное для директорий и файлов пользователя.

 

III Создание директорий ( mkdir )

В директории $HOME создадим новую директорию:

 
mkdir myprog
 

Затем перейдём в общее хранилище телефона и создадим в нём ещё одну директорию:

 
cd storage/shared
mkdir myscript
 

В директории  myscript  будут храниться исходники собственных программ, а в директории  myprog  будут создаваться и запускаться исполняемые файлы.
Полный адрес первой директории будет
 /data/data/com.termux/files/home/myprog 
в второй (со ссылками):
 /data/data/com.termux/files/home/storage/shared/myscript 
или реальный (без ссылок):
 /storage/emulated/0/myscript 

Если часто пользоваться такими адресами, это быстро может надоесть.
Для первого адреса есть аналог:  ~/myprog 
неплохо было бы создать что-то такое и для второго адреса.

 

IV Символическая ссылка (ln)

Создадим в директории $HOME символ«ческую ссылку с помощью команды  ln -s .

Синтаксис:

 
ln -s <target_path> <link_name>
 

Где:

 <target_path>  — путь к целевой директории, на которую нужно создать ссылку;
 <link_name>  — имя создаваемой символической ссылки.

Для создания зайдём в домашнюю директорию и введём адрес и имя ссылки:

 
cd ~
ln -s /storage/emulated/0/myscript myscript
 

Посмотрим что получилось в итоге:

 
ls -l myscript
 

Вывод будет примерно таким:

 
lrwxrwxrwx. 1 u0_a212 u0_a212 28 Apr 28 21:16 myscript -> /storage/emulated/0/myscript
 

т.е. получилось то, что и ожидалось — символическая ссылка на нужную директорию.
Работать с этой ссылкой можно также как и с обычной директорией, за исключением случая если нужно будет её стереть:
 rm myscript  удалит ссылку, а
 rm -r myscript  удалит и ссылку и директорию на которую эта ссылка указывает.

После создания ссылки, к обеим директориям можно будет обращаться по простому:

 
cd ~/myprog && ls
cd ~/myscript && ls
 

Надеюсь это немного упростит навигацию и написание Makefile в будущей работе.

 

V Архивация директорий ( zip )

Общая память телефона — более надёжное место для хранения исходных текстов программ, чем песочница Термукс, но время от времени желательно было бы копировать директорию  myscript  в облачное хранилище.
Это можно делать, например, файловым менеджером: зайти в приложение, выбрать папку и скопировать в нужное облако.
Но если представить себе, что мы написали большое количество исходных текстов программ, которые разложены по своим папкам, то процесс загрузки этой стаи файлов в облако может сильно затянуться.
Поэтому перед копированием, директорию  myscript  желательно превратить в один файл (что значительно ускорит загрузку в облако) с помощью архиватора.

Для начала нужно установить в Термукс утилиты:

 
pkg update
pkg upgrade
pkg install zip unzip
 

и после установки будут доступны:

команда  zip  — для создания ZIP‑архивов;
команда  unzip  — для распаковки ZIP‑архивов.

Далее создадим в общем хранилище директорию  zip  для будущих архивов:

 
cd ~/storage/shared && mkdir zip
 

Чтобы создать ZIP‑архив из директории  myscript  со всем содержимым, используем команду  zip  с флагом  -r  (рекурсивное копирование — включает все файлы и поддиректории):

 
zip -r /storage/emulated/0/zip/myscript.zip /storage/emulated/0/myscript/
 

Разбор команды:

 zip  — вызов утилиты для создания архивов;
 -r  — флаг рекурсии: гарантирует, что будут заархивированы не только файлы верхнего уровня, но и все подкаталоги с их содержимым;
 myscript.zip  — имя создаваемого архива;
 ~/myscript/  — путь к директории, которую нужно заархивировать.

Проверка результата
Чтобы убедиться, что архив создан корректно и содержит нужные файлы, просмотрите его содержимое:

 
unzip -l ~/storage/shared/zip/myscript
 

Вывод:

 
Archive:  /storage/emulated/0/zip/myscript.zip
  Length      Date    Time    Name
---------  ---------- -----  ----
        0  2026-04-29 20:28  storage/emulated/0/myscript/
---------                    -------
        0                    1 file
 

Из этого можно сделать ложный вывод, что архив содержит одну директорию и имеет размер 0 байт.
Посмотрим информацию о самом файле:

 
ls -l /storage/emulated/0/zip/myscript.zip
-rw-rw----. 1 root everybody 206 Apr 29 20:29 /storage/emulated/0/zip/myscript.zip
 

Как видно, длинна архива 206 байт, а если распаковать его например файловым менеджером, то выяснится, что архив состоит из вложенных друг в друга пустых директорий:  storage ,  emulated ,  0 ,  myscript .
Так получается из-за особенностей работы архиватора.
Нам эти лишние уровни вложенности не нужны, поэтому попробуем архивировать нашу директорию по—другому.

 

VI Скрипт на Bash

Разделим команду на 2 части:

 
cd ~/storage/shared && zip -r zip/myscript.zip myscript
 

Теперь архив будет содержать только одну пустую директорию  myscript .

Хотелось бы, чтобы имена zip-файлов отличались друг от друга временем их создания, чтобы не запутаться в них.
Для этого лучше написать программу на Bash, чтобы не вводить каждый раз одни и теже адреса вручную.
Создадим в директории  myscript  директорию  bash , перейдём в неё и создадим файл  zip-myscript :

 
cd ~/myscript
mkdir bash
cd bash
touch zip-myscript
 

Собственно говоря, для написания скриптов в директории, находящейся в общем хранилище телефона, Termux и не нужен.
Можно воспользоваться любым текстовым редактором, чтобы создать новый файл по нужному адресу.

Запишем в файл zip-myscript следующее:

 
#адрес внутренней памяти
cd /storage/emulated/0

zip -r zip/myscript_$(date +"%Y-%m-%d_%H-%M-%S").zip myscript
 

Теперь можно будет войти в Termux и запустить его:

 
bash ~/storage/shared/myscript/bash/zip-myscript
 

 

VII Ещё один скрипт

Собрать в один файл можно и несколько папок, например хранилища моих заметок в разных блокнотах.
Создадим в директории  /storage/emulated/0/myscript/bash/  файл  zip-mynote :

 
#адрес внутренней памяти
cd /storage/emulated/0

zip -r zip/mynote_$(date +"%Y-%m-%d_%H-%M-%S").zip Notepad Notepad2 Notepad3 Notepad4 Note2 Note3 Note4 Note5 fastnote fastnote2 fastnote3 fastnote4 Obsidian ZettelNotes
 

Запускаться из Termux он будет так:

 
bash ~/storage/shared/myscript/bash/zip-mynote
 

У этих двух скриптов есть один серьёзный недостаток – они зависят от сторонней утилиты  zip , которою установить в **droid-ы видимо невозможно.
Поэтому скрипты будут исполняться только из Termux и дальше мы спрячем их вовнутрь Termux, сделаем их исполняемыми и превратим в команды, которые можно будет вызывать из любого места Termux и даже с рабочего стола телефона, не заходя в Термукс.

 

VIII Исполняемые скрипты (chmod)

Исполняемыми файлы можно сделать только внутри песочницы Термукс.
Для этого нужно скопировать скрипты во внутреннее пространство, дописать в их начало шэбанги и дать им права на исполнение.
Начнём с шебангов.
Изменим оба скрипта в директории  mysript/bash  таким образом:

Файл  zip-mynote :

 
#!/data/data/com.termux/files/usr/bin/bash

#- Program: `zip-mynote`
#+ Создаёт zip-архив из указанных директорий
#+ в общем хранилище
#+ Требуeтся утилитa `zip`

#адрес внутренней памяти
cd /storage/emulated/0

zip -r zip/mynote_$(date +"%Y-%m-%d_%H-%M-%S").zip Notepad Notepad2 Notepad3 Notepad4 Note2 Note3 Note4 Note5 fastnote fastnote2 fastnote3 fastnote4 Obsidian ZettelNotes
 

Файл  zip-myscript :

 
#!/data/data/com.termux/files/usr/bin/bash

#- Program: `zip-myscript`
#+ Создаёт zip-архив из указанной директории myscript
#+ в общем хранилище
#+ Требуeтся утилитa `zip`

#адрес внутренней памяти
cd /storage/emulated/0

zip -r zip/myscript_$(date +"%Y-%m-%d_%H-%M-%S").zip myscript
 

Здесь в начало текстов скриптов добавлены строки комментариев, которые в языках оболочек начинаются со знака решётки и далее могут содержать любой текст и даже смайлы (последнее не рекомендуется).
Исключение — строка с символами  #!  (шэбанг).
Такая строка в скрипте бывает только одна и обычно помещается в самое начало.
Она указывает оболочке, какую программу-интерпретатор нужно запустить для исполнения дальнейшего текста скрипта (в нашем случае bash).
После символов  #!  сразу без пробела записывается полный адрес программы-интерпретатора.

Зайдём в Термукс и создадим в директории  myprog  директорию  bash :

 
cd ~/myprog && mkdir bash
 

скопируем в неё оба скрипта:

 
cd ~/storage/shared/myscript/bash && cp zip-mynote zip-myscript ~/myprog/bash/
 

Проверим:

 
ls ~/myprog/bash
 

Если файлы успешно скопировались, выдадим им права на исполнение:

 
chmod +x ~/myprog/bash/zip-mynote ~/myprog/bash/zip-myscript
 

Теперь можно их запускать просто набрав в командной строке их адрес:

 
~/myprog/bash/zip-mynote && ~/myprog/bash/zip-myscript
 

Если всё сделано правильно то в папке  zip  в общем хранилище появятся 2 файла–архива с текущим временем в именах.

Всё это конечно хорошо, но набирать длинные адреса непроизводительно, поэтому сделаем из этих скриптов обычные для Linux команды.

 

IX Собственные команды

Команды в Linux — это и скрипты, и бинарники и ссылки, которые находятся в директориях, указанных в переменной окружения $PATH.

Создадим в домашней директории новую директорию  bin  для наших собственных команд:

 
mkdir ~/bin
 

и переместим в неё будущие команды:

 
mv ~/myprog/bash/zip-note ~/myprog/bash/zip-script ~/bin
 

Добавить директорию  ~/bin  в переменную окружения $PATH можно

Обсуждение
12:55(1)
Александр Красилов
13:05(1)
J04 D1v1510n
Надоел детский садик
Люди даже файловым менеджером пользоваться не умеют и зачем—то скачивают приложения облаков   гугл яндекс дроп и пр. превращая  мобильники в чурюпахи 0о0
Современный мир — это несколько поколений рекламозависимых   потреблятелей
19:13(1)
Александр Красилов
А что такое скрипт?
19:26
J04 D1v1510n
тестовый файл с исходным текстом программы.
Ассемблер, С, go и пр. превращают эти тексты в файлы машинного кода с загрузчиками, которые можно запускать как самостоятельные приложения.
Также скрипты — это тексты программ для языков которые исполняют их строка за строкой, не создавая файлов с машкодом
Такие языки называют интерпретируемымм или скриптовыми (Bash, Python, Ruby и др.)

Упрощённо: скрипт ≈ файл с текстом программы
Книга автора
Самый страшный день войны 
 Автор: Виктор Владимирович Королев