mAsciinema.sh 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #!/bin/bash
  2. E='echo -e'; # -e включить поддержку вывода Escape последовательностей
  3. e='echo -en'; # -n не выводить перевод строки
  4. c="+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+"
  5. trap "R;exit" 2 #
  6. ESC=$( $e "\e")
  7. TPUT(){ $e "\e[${1};${2}H" ;}
  8. CLEAR(){ $e "\ec";}
  9. # 25 возможно это
  10. CIVIS(){ $e "\e[?25l";}
  11. # это цвет текста списка перед курсором при значении 0 в переменной UNMARK(){ $e "\e[0m";}
  12. MARK(){ $e "\e[1;45m";}
  13. # 0 это цвет списка
  14. UNMARK(){ $e "\e[0m";}
  15. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Эти строки задают цвет фона ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  16. R(){ CLEAR ;stty sane;CLEAR;}; # в этом варианте фон прозрачный
  17. HEAD(){ for (( a=2; a<=40; a++ ))
  18. do
  19. TPUT $a 1
  20. $E "\033[1;35m\xE2\x94\x82 \xE2\x94\x82\033[0m";
  21. done
  22. TPUT 3 3
  23. $E "\033[1;35m*** asciinema *** рекордер терминальной сессии\033[0m";
  24. TPUT 4 7
  25. $E "\033[2masciinema позволяет легко записывать терминальные сессии и воспроизводить их в терминале, а также в веб-браузере.\033[0m";
  26. TPUT 5 1
  27. $E "\033[1;35m$c\033[0m";
  28. TPUT 14 3
  29. $E "\033[36mAvailable options:\033[90m Доступные опции:\033[0m";
  30. TPUT 33 3
  31. $E "\033[36mAvailable options:\033[90m Доступные опции:\033[0m";
  32. TPUT 38 3
  33. $E "\033[32mUp \xE2\x86\x91 \xE2\x86\x93 Down Select Enter\033[0m";
  34. MARK;TPUT 1 1
  35. $E "$c";UNMARK;}
  36. i=0; CLEAR; CIVIS;NULL=/dev/null
  37. # 32 это расстояние сверху и 48 это расстояние слева
  38. FOOT(){ MARK;TPUT 41 1
  39. $E "$c";UNMARK;}
  40. # это управляет кнопками ввер/хвниз
  41. i=0; CLEAR; CIVIS;NULL=/dev/null
  42. #
  43. ARROW(){ IFS= read -s -n1 key 2>/dev/null >&2
  44. if [[ $key = $ESC ]];then
  45. read -s -n1 key 2>/dev/null >&2;
  46. if [[ $key = \[ ]]; then
  47. read -s -n1 key 2>/dev/null >&2;
  48. if [[ $key = A ]]; then echo up;fi
  49. if [[ $key = B ]];then echo dn;fi
  50. fi
  51. fi
  52. if [[ "$key" == "$($e \\x0A)" ]];then echo enter;fi;}
  53. M0(){ TPUT 6 3; $e " Установка \033[32minstall \033[0m";}
  54. M1(){ TPUT 7 3; $e " Oбзор \033[32mSynopsis \033[0m";}
  55. M2(){ TPUT 8 3; $e " Окружающая среда \033[32mEnvironment \033[0m";}
  56. M3(){ TPUT 9 3; $e " Ошибки \033[32mBugs \033[0m";}
  57. M4(){ TPUT 10 3; $e " Автор \033[32mAuthor \033[0m";}
  58. M5(){ TPUT 11 3; $e " Версия \033[32m --version \033[0m";}
  59. M6(){ TPUT 12 3; $e "\033[1;36m--- Commands ------------------------------------------------------------------------------ \033[90mКоманды ------------------\033[0m";}
  60. M7(){ TPUT 13 3; $e " Запись терминальной сессии \033[36m rec \033[0m";}
  61. #
  62. M8(){ TPUT 15 3; $e " Включить stdin (keyboard) запись (см. ниже) \033[32m --stdin \033[0m";}
  63. M9(){ TPUT 16 3; $e " Приходите к существующей записи \033[32m --append \033[0m";}
  64. M10(){ TPUT 17 3; $e " Сохраните выход сырья STDOUT, без информации о сроках или других метаданных \033[32m --raw \033[0m";}
  65. M11(){ TPUT 18 3; $e " Переписать запись, если она уже существует \033[32m --overwrite \033[0m";}
  66. M12(){ TPUT 19 3; $e " Укажите команду для записи, по умолчанию до \$SHELL \033[32m-c --command=<command> \033[0m";}
  67. M13(){ TPUT 20 3; $e " Список переменных среды для захвата, по умолчанию для SHELL,TERM \033[32m-e --env=<var-names> \033[0m";}
  68. M14(){ TPUT 21 3; $e " Укажите название ансикаста \033[32m-t --title=<title> \033[0m";}
  69. M15(){ TPUT 22 3; $e " Ограничение неактивности терминала к максимуму <sec> секунд</sec> \033[32m-i --idle-time-limit=<sec>\033[0m";}
  70. M16(){ TPUT 23 3; $e " Ответ «да» на все подсказки (например, загрузите подтверждение) \033[32m-y --yes \033[0m";}
  71. M17(){ TPUT 24 3; $e " Будьте спокойны, подавляйте все уведомления/предупреждения (как раз -y) \033[32m-q --quiet \033[0m";}
  72. M18(){ TPUT 25 3; $e " Воспроизведение записанного ассикаста в терминале \033[36m play \033[0m";}
  73. M19(){ TPUT 26 3; $e " Доступны следующие клавиши: ";}
  74. M20(){ TPUT 27 3; $e " Игра из локального файла: ";}
  75. M21(){ TPUT 28 3; $e " Игра с URL HTTP(S): ";}
  76. M22(){ TPUT 29 3; $e " Игра с сайта asciicast URL ";}
  77. M23(){ TPUT 30 3; $e " Игра от stdin: ";}
  78. M24(){ TPUT 31 3; $e " Игра от IPFS: ";}
  79. M25(){ TPUT 32 3; $e " Распечатать полный выход записанного аскциаста до терминала \033[32mcat <filename> \033[0m";}
  80. #
  81. M26(){ TPUT 34 3; $e " Ограничение повторного использования терминала неактивность к максимуму <sec> секунд</sec> \033[32m-i --idle-time-limit=<sec>\033[0m";}
  82. M27(){ TPUT 35 3; $e " Скорость воспроизведения (может быть дробной) \033[32m-s --speed=<factor> \033[0m";}
  83. M28(){ TPUT 36 3; $e " Загрузка \033[36m upload \033[0m";}
  84. M29(){ TPUT 37 3; $e " Связать свой идентификатор установки с учетной записью пользователя \033[36m auth \033[0m";}
  85. #
  86. M30(){ TPUT 39 3; $e " Выход \033[32m Exit \033[0m";}
  87. LM=30
  88. MENU(){ for each in $(seq 0 $LM);do M${each};done;}
  89. POS(){ if [[ $cur == up ]];then ((i--));fi
  90. if [[ $cur == dn ]];then ((i++));fi
  91. if [[ $i -lt 0 ]];then i=$LM;fi
  92. if [[ $i -gt $LM ]];then i=0;fi;}
  93. REFRESH(){ after=$((i+1)); before=$((i-1))
  94. if [[ $before -lt 0 ]];then before=$LM;fi
  95. if [[ $after -gt $LM ]];then after=0;fi
  96. if [[ $j -lt $i ]];then UNMARK;M$before;else UNMARK;M$after;fi
  97. if [[ $after -eq 0 ]] || [ $before -eq $LM ];then
  98. UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;}
  99. INIT(){ R;HEAD;FOOT;MENU;}
  100. SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;}
  101. # Функция возвращения в меню
  102. ES(){ MARK;$e " ENTER = main menu ";$b;read;INIT;};INIT
  103. while [[ "$O" != " " ]]; do case $i in
  104. # Здесь необходимо следить за двумя перепенными 0) и S=M0 Они должны совпадать между собой и переменной списка M0().
  105. 0) S=M0 ;SC;if [[ $cur == enter ]];then R;echo "
  106. Официальный представитель предоставил N методов установки, соответствующих различным дистрибутивам Linux, но здесь по-прежнему рекомендуется использовать для
  107. установки pip3. Необходимо пояснить, что для установки таким образом требуется Python 3. Похоже, что сейчас проектов Python становится все больше и больше. 2.7 был
  108. заброшен, и это действительно общая тенденция.Команда установки очень проста, а именно:
  109. sudo apt install python3-pip
  110. sudo pip3 install asciinema
  111. #
  112. sudo apt-add-repository ppa:zanchey/asciinema && sudo apt-get update && sudo apt-get install asciinema
  113. #
  114. sudo snap install asciinema --classic
  115. #
  116. git clone https://github.com/asciinema/asciinema.git
  117. cd asciinema
  118. sudo python3 -m asciinema --version
  119. ";ES;fi;;
  120. 1) S=M1 ;SC;if [[ $cur == enter ]];then R;echo " asciinema command [options] [args]";ES;fi;;
  121. 2) S=M2 ;SC;if [[ $cur == enter ]];then R;echo "
  122. ASCIINEMA_API_URL
  123. Эта переменная позволяет пересчитать URL-адрес asciinema-server который по умолчанию на: https://asciinema.org
  124. в случае, если вы управляете своим собственным: asciinema-server в‐ stance
  125. ASCIINEMA_CONFIG_HOME
  126. Эта переменная позволяет переопределять положение каталога config. По умолчанию месторасположение \\XDG_CONFIG_HOME/asciinema (когда \\XDG_CONFIG_HOME установлен)
  127. или \\HOME/.config/asciinema
  128. ";ES;fi;;
  129. 3) S=M3 ;SC;if [[ $cur == enter ]];then R;echo " Смотрите проблемы на GitHub: https://github.com/asciinema/asciinema/issues";ES;fi;;
  130. 4) S=M4 ;SC;if [[ $cur == enter ]];then R;echo "
  131. Ведущий разработчик asciinema — Марцин Кулик.
  132. Список всех участников смотрите здесь: https://github.com/asciinema/asciinema/contributors
  133. Эта страница руководства была написана Марцином Куликом с помощью Курта Пфайфле.
  134. ";ES;fi;;
  135. 5) S=M5 ;SC;if [[ $cur == enter ]];then R;echo " asciinema --version";ES;fi;;
  136. 6) S=M6 ;SC;if [[ $cur == enter ]];then R;echo " asciinema состоит из нескольких команд, подобных git, apt-get или brew.
  137. Когда вы запускаете asciinema без аргументов, отображается сообщение справки, в котором перечислены все доступные команды с их параметрами.";ES;fi;;
  138. 7) S=M7 ;SC;if [[ $cur == enter ]];then R;echo -e "
  139. \e[32m asciinema rec first.cast\e[0m
  140. вы начнете новый сеанс записи. Записываемая команда (процесс) может быть указана с опцией -c (см. ниже), и по умолчанию
  141. \$SHELL, что вам нужно в большинстве случаев.
  142. Запись заканчивается, когда вы выходите из оболочки (нажмите Ctrl+D или введите exit). Если записываемый процесс не является оболочкой, то запись завершается,
  143. когда процесс завершается это.
  144. Если аргумент имени файла опущен, то (после запроса подтверждения) результирующий asciicast загружается на asciinema-сервер:
  145. https://github.com/asciinema/asciinema-server (по умолчанию asciinema.org), где его можно посмотреть и поделиться им.
  146. Если указан аргумент имени файла, результирующая запись (называемая asciicast (doc/asciicast-v2.md)) сохраняется в локальном файле. Позже его можно будет
  147. воспроизвести с asciinema play <имя файла> и/или загруженным на сервер asciinema с asciinema upload <имя файла>.
  148. ASCIINEMA_REC=1 добавляется к записанным переменным среды процесса. Это может использоваться файлом конфигурации вашей оболочки (.bashrc, .zshrc) для изменения
  149. подсказки или воспроизводить звук при записи оболочки.
  150. Запись стандартного ввода позволяет записывать все символы, введенные пользователем в текущей записанной оболочке. Это может быть использовано игроком. Hапример,
  151. asciinema-player: https://github.com/asciinema/asciinema-player, для отображения нажатых клавиш. Потому что это, по сути, ведение журнала ключей (применительно к
  152. одной оболочке в пределах одной оболочки stance, по умолчанию он отключен, и его необходимо явно включить с помощью параметра –stdin.
  153. ------------------------------------------------------------------------------------------------------------------------------------------------------------------
  154. Вы можете записывать и загружать за один шаг, опуская имя файла:
  155. asciinema rec
  156. Когда запись будет завершена, вас попросят подтвердить загрузку, поэтому без вашего согласия ничего никуда не отправляется.
  157. ------------------------------------------------------------------------------------------------------------------------------------------------------------------
  158. Обратите внимание, что после выполнения этой команды весь ваш следующий ввод и вывод будет записан в указанный файл, а эффект записи синхронизируется с временем
  159. ввода и вывода в это время.
  160. Когда запись закончится, нажмите сочетание клавиш
  161. Ctrl + D или введите exit
  162. ";ES;fi;;
  163. 8) S=M8 ;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  164. 9) S=M9 ;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  165. 10) S=M10;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  166. 11) S=M11;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  167. 12) S=M12;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  168. 13) S=M13;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  169. 14) S=M14;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  170. 15) S=M15;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  171. 16) S=M16;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  172. 17) S=M17;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  173. 18) S=M18;SC;if [[ $cur == enter ]];then R;echo -e "
  174. Эта команда воспроизводит данное asciicast (как записан rec команда) непосредственно в вашем терминале:
  175. \e[32m asciinema play first.cast\e[0m
  176. ";ES;fi;;
  177. 19) S=M19;SC;if [[ $cur == enter ]];then R;echo "
  178. Space - toggle pause - шаг за записью кадра в то время (при отмене),
  179. Ctrl+C - выход.
  180. ";ES;fi;;
  181. 20) S=M20;SC;if [[ $cur == enter ]];then R;echo " asciinema play /path/to/asciicast.cast";ES;fi;;
  182. 21) S=M21;SC;if [[ $cur == enter ]];then R;echo "
  183. asciinema play https://asciinema.org/a/22124.cast
  184. asciinema play http://example.com/demo.cast
  185. ";ES;fi;;
  186. 22) S=M22;SC;if [[ $cur == enter ]];then R;echo "
  187. (requires <link rel="alternate" type="application/x-asciicast" href="/my/ascii.cast"> in page's HTML):
  188. asciinema play https://asciinema.org/a/22124
  189. asciinema play http://example.com/blog/post.html
  190. ";ES;fi;;
  191. 23) S=M23;SC;if [[ $cur == enter ]];then R;echo "
  192. cat /path/to/asciicast.cast | asciinema play -
  193. ssh user@host cat asciicast.cast | asciinema play -
  194. ";ES;fi;;
  195. 24) S=M24;SC;if [[ $cur == enter ]];then R;echo " asciinema play dweb:/ipfs/QmNe7FsYaHc9SaDEAEXbaagAzNw9cH7YbzN4xV7jV1MCzK/ascii.cast";ES;fi;;
  196. 25) S=M25;SC;if [[ $cur == enter ]];then R;echo "
  197. В то время как asciinema играет воспроизводит записанную сессию с использованием информации о сроках, сохраненной в аскициате, асинема cat сваливает полный
  198. выход (включая все escape последовательности) к терминалу немедленно:
  199. asciinema cat existing.cast >output.txt
  200. дает такой же результат, как запись через asciinema rec -raw вывода. Ткст
  201. ";ES;fi;;
  202. 26) S=M26;SC;if [[ $cur == enter ]];then R;echo "
  203. Или с нормальной скоростью, но с простое время ограничено 2 секунды:
  204. asciinema play -i 2 first.cast
  205. Вы можете пройти -i 2 to asciinema rec также, установить его навсегда на запись. Ограничение времени Idle делает записи гораздо интереснее смотреть, попробуйте.
  206. ";ES;fi;;
  207. 27) S=M27;SC;if [[ $cur == enter ]];then R;echo "
  208. повторите его с двойной скоростью:
  209. asciinema play -s 2 first.cast
  210. ";ES;fi;;
  211. 28) S=M28;SC;if [[ $cur == enter ]];then R;echo -e "
  212. Загрузите записанные аскциасты на сайт asciinema.org.
  213. Эта команда загружает данное asciicast (записано rec команд) на asciinema.org, где его можно смотреть и делиться.
  214. asciinema rec demo.cast + asciinema играть demo.cast + asciinema загрузить демо. cast - это хороший комбо, если вы хотите просмотреть аскиз, прежде чем публиковать
  215. asciinema.org
  216. Приведенное выше загружает его на: https://asciinema.org, который является экземпляром asciinema-server по умолчанию https://github.com/asciinema/asciinema-server
  217. и печатает секретная ссылка, которую вы можете использовать для просмотра записи в веб-браузере.
  218. Если вы хотите посмотреть и поделиться им в Интернете, загрузите его:
  219. \e[32m asciinema upload first.cast\e[0m
  220. ";ES;fi;;
  221. 29) S=M29;SC;if [[ $cur == enter ]];then R;echo -e "
  222. Связать свой идентификатор установки с учетной записью пользователя asciinema.org.
  223. Если вы хотите управлять своими записями (изменить название / тема, удалить) на asciinema.org вам нужно связать свой «установить ID» с учетной записью
  224. пользователя asciinema.org. Эта команда отображает URL, чтобы открыть в веб-браузере, чтобы сделать это. Возможно, вам придется сначала войти в систему.
  225. Установить ID является случайным ID (UUID v4 (https://ru.wikipedia.org/wiki/Universally_unique_identifier) генерируется локально, когда вы запускаете asciinema
  226. для первого время, и сохраненный на \$HOME/.config/asciinema/install-id Это цель состоит в том, чтобы подключить местную машину с загруженными записями, так что они
  227. могут позже быть связаны с аккаунтом asciinema.org. Таким образом, мы отключаем загрузку с создания учетной записи, позволяя им случиться в любом порядке.
  228. Примечание: Новый идентификатор установки генерируется на каждом аккаунте пользователя машины и системы, на котором вы используете asciinema, чтобы сохранить все
  229. записи под одним asciinema.org учетная запись вам нужно запустить asciinema auth на всех этих машинах.
  230. Примечание: версии asciinema до 2.0 запутанно называют установить ID как “API token”.
  231. \e[32m asciinema auth first.cast\e[0m
  232. ";ES;fi;;
  233. 30) S=M30;SC;if [[ $cur == enter ]];then R;exit 0;fi;;
  234. esac;POS;done