# Запуск Python програм з терміналу Linux
# Якщо треба вийти/відмінити/перервати
## Спочатку спробуйте клавішу <kbd>q</kbd> або <kbd>Esc</kbd>
Скорочено від QUIT. Вона працює як "вихід" у багатьох програмах --- в
tig, htop, less, ranger, ncdu, man, ...
## Потім <kbd>Ctrl-c</kbd>
Хоч це такий же хоткей як "скопіювати", в лінукс терміналах він означає "перервати роботу".
## Для Vim <kbd>Esc</kbd> <kbd>:</kbd><kbd>q!</kbd><kbd>Enter</kbd>
Це виходу з редактору `Vim`/`Neovim`. Якщо з першого разу не спрацювало, спробуйте ще кілька разів.
Мова вводу повинна бути англійська!
## Для nano <kbd>Ctrl-x</kbd>
Це команда виходу з редактору `nano`. Може знадобитись підтвердження.
## Для tmux <kbd>Ctrl-b</kbd> <kbd>d</kbd>
Це команда відключення від `tmux`, без переривання його роботи.
## <kbd>Ctrl-d</kbd>
Це команда виходу з `bash` та `ssh`.
# Базові програми для роботи в консолі
## SSH
Підключенні до віддаленого серверу відбувається через SSH:
```
ssh user@server
```
(параметри `user` та `server` отримайте окремо).
При першому вході потрібно підтвердити ключ (набрати `yes` та Enter).
При старті запуститься Bash від імені вашого юзера. Якщо натиснути <kbd>Ctrl-d</kbd>,
то з'єднання завершиться. Можна зробити кілька підключень з кількох різних терміналів.
Для авторизації може використовуватись і пароль, але безпечніше і зручніше через асиметричний ключ.
## Bash та coreutils
Bash та coreutils складаються з кількох сотень команд та конструкцій. Сумарно вони стають повноцінною
мовою програмування. Основний типом даних який використовується в Баш, є рядок і список рядків.
### Хоткеї
- клавіші вверх/вниз --- рухатись по історії команд, щоб не перенабирати команди які вже були набрані
- <kbd>Tab</kbd><kbd>Tab</kbd> --- автодоповнення. **НАЙПОПУЛЯРНІШИЙ** хоткей, працює дуже часто
і спрощує набір команд і назв файлів
- <kbd>Ctrl-r</kbd> --- шукати по історії. Можна ввести шматок команди і Баш пошукає найсхожішу команду
- <kbd>Ctrl-c</kbd> --- перервати команду або процес
- <kbd>Home</kbd> / <kbd>End</kbd> --- перейти в початок або кінець рядка
- <kbd>Ctrl-d</kbd> --- вийти з башу
### Файли і папки (files and directories)
- `pwd` --- показати поточну папку
- `ls`, `ls -la` --- показати файли і папки в поточній папці
- `cd ..` --- перейти в папку вище
- `cd dirname` --- перейти в дочірню папку `dirname`
- `cd /bla/blo/ble` --- перейти в конкретну папку в системі
- `cat filename` --- вивести на екран вміст файлу. Розширення у файлу може не бути.
Великі і маленькі букви потрібно писати відповідно, не можна змішувати!
- `echo "Test test test" > filename` --- записати фразу в файл `filename`. Ця конструкція
називається "перенаправлення виводу", тобто, текст буде виводитись не на екран, а в файл
- `mkdir dirname` --- зробити папку `dirname`
### Змінні (env vars)
- `export BLABLA=testtest` --- зробити змінну `BLABLA` і записати в неї `testtest`.
**Навколо = не повинно бути пробілів! Це мегаважливо!**
- `echo $BLABLA` --- вивести змінну на екран
- `env` --- вивести всі наявні змінні на екран
- змінна `PS1` відповідає за відображення промпту в Баш, і її можна змінити
- змінна `PATH` відповідає за те, де знаходяться програми для швидкого запуску, і її можна міняти
- змінну `EDITOR` відповідає за те, який редактор є дефолтним, і її можна змінити
- `echo "This is some $BLABLA text"` --- використання змінної всередині рядка зробить
заміну. Це називається **інтерполяція змінної**, або **підстановка змінної**
- `echo "my current user is ${USER}"` --- так також можна робити інтерполяцію змінної.
- `echo "my current dir is $(pwd)"` --- в круглих дужках відбудеться **інтерполяція
команди**. Тобто, в даному випадку команда `pwd` буде запущена, і її вивід підставиться
в рядок. В Пайтоні це називається "виклик функції".
### Запуск
- `cowsay "Hello my friend"` --- запустити команду `cowsay` з параметром
- `fortune | cowsay` --- запустити команду `fortune`, і передати її вивід на вхід до `cowsay`.
Конструкція називається **пайп** (pipe), бо текст від одної команди йде до іншої якби по трубі.
- `fortune | figlet | lolcat` --- те саме, але тепер тут три команди передають одна до
одної тексти.
- `python some_file.py` --- запустити пайтон скрипт
- `./some_file.py` --- якщо файл налаштовано як "запускаємий", то файл буде запущено
- `cat some_file.py | less` --- вивести файл у пейджер `less`
Пайпи універсальні. Практично будь-яку команду можна передати у пайп, і багато команд вміють читати
з пайпу.
## less (пейджер)
Якщо зробити `less some_file.py` або `cat some_file.py | less`, то файл можна переглядати у режимі
пейджера. Хоткеї:
- <kbd>q</kbd> --- вийти
- <kbd>Up/Down</kbd> --- рухатись по файлу
- <kbd>PgUp/PgDown</kbd> --- рухатись по файлу швидше
- <kbd>/</kbd> --- шукати в файлу. Пишіть текст, тисніть <kbd>Enter</kbd> і якщо такий текст є
то less туди перейде. Натисність <kbd>/</kbd><kbd>Enter</kbd> щоб шукати далі
- <kbd>?</kbd> --- шукати в файлі *назад*. Аналогічно попередній команді
- <kbd>-</kbd><kbd>S</kbd><kbd>Enter</kbd> --- не переводити рядки на нові якщо вони дуже довгі.
Працює як перемикач для всього файлу
## man (мануал)
Показує документацію (мануал) по команді. Якщо забули які у команди параметри, можна підглянути в
`man`:
- `man cowsay`
- `man lolcat`
- `man tmux`
- `man man`
- ...
## tmux (мультиплексер терміналів)
Дозволяє кілька крутих штук:
- tmux сесія не закривається якщо зупиняється SSH або закривається термінал. Вона буде висіти
доки сервер не перезагрузиться або явно не закриють сесію.
- можна робити вкладки в терміналі (переключатись між кількома Bash-ами)
- можна робити розбиття екрану вертикально або горизонтально (наприклад, зверху редактор, а знизу
запуск коду)
Як запускати:
- `tmux a` --- підключитись до першої ліпшої сесії, якщо вона вже є
- `tmux new -s myname` --- створити нову сесію з іменем `myname`. Зручно, якщо не хочете заважати
колегам по терміналу
- `tmux a -t myname` --- підключитись до сесії по імені
- `\tmux` --- запустити індивідуальну сесію, до якої тільки у вас є доступ
Хоткеї, коли вже запущено:
- <kbd>Ctrl-b</kbd> --- так званий **префікс** (prefix-key). Всі хоткеї по роботі з tmux
повинні починатись з цього хоткею. Тому практично всі хоткеї подвійні.
- <kbd>Ctrl-b</kbd><kbd>d</kbd> --- відключитись і не закривати tmux
- <kbd>Ctrl-b</kbd><kbd>s</kbd> --- подивитись які є інші сесії
- <kbd>Ctrl-b</kbd><kbd>с</kbd> --- запустити нову вкладку
- <kbd>Ctrl-b</kbd><kbd>x</kbd><kbd>y</kbd> --- закрити вкладку
- <kbd>Ctrl-b</kbd><kbd>2</kbd> --- переключитись на вкладку з номером 2. Номер означає на яку вкладку переключитись
- <kbd>Ctrl-b</kbd><kbd>w</kbd> --- подивитись які є вкладки
- <kbd>Ctrl-b</kbd><kbd>"</kbd> --- розбити вкладку горизонтально (h split). Щоб закрити її просто вийдіть з Башу через Ctrl-d
- <kbd>Ctrl-b</kbd><kbd>%</kbd> --- розбити вкладку вертикально (v split)
- <kbd>Ctrl-b</kbd><kbd>Left/Right/Up/Down</kbd> --- переміщатись між вкладками
- <kbd>Ctrl-b</kbd><kbd>z</kbd> --- зробити вкладку на весь екран. Якщо натисну ще раз, то вернеться назад
## Neovim (`nvim`)
Це консольний редактор файлів. Його фішка в тому, що він запускається у "нормальному" режимі спочатку.
В цьому режимі НЕ можна вставляти символи і текст. Всього є кілька режимів (modes):
- нормальний (normal), в цей режим можна вертатись клавішої <kbd>Esc</kbd>
- вставка (insert), доступний по клавіші <kbd>i</kbd>, тут можна писати букви
- виділення (visual), клавіша <kbd>v</kbd>, дозволяє виділяти текст
- команди (command), клавіша <kbd>:</kbd>, дозволяє писати складні команди
- термінал (terminal), запускається по <kbd>:</kbd>`term`<kbd>Enter</kbd>, виходити по <kbd>Ctrl-\ </kbd><kbd>Ctrl-n</kbd>
:::warn
Всі великі букви треба набирати як великі букви!
:::
Команд і хоткеїв мільйон, але найкорисніші (всі запускати тільки з номального режиму):
- `:w`<kbd>Enter</kbd> -- зберегти файл
- `:q`<kbd>Enter</kbd> -- вийти
- `:wq`<kbd>Enter</kbd> -- зберегти і вийти
- `:q!`<kbd>Enter</kbd> -- вийти і не зберігати
- <kbd>V</kbd>(далі клавіші вниз-вверх) -- зробити виділення
- <kbd>y</kbd> -- скопіювати виділення
- <kbd>d</kbd> -- вирізати виділення
- <kbd>></kbd> -- посунути текст в сторону
- <kbd>.</kbd> -- повторити попередню команду
- <kbd>P</kbd> -- вставити
- <kbd>u</kbd> -- відміна дії (undo)
- <kbd>Ctrl-r</kbd> -- відміна відміни (redo)
- <kbd>/</kbd> -- шукати в файлі (як у less)
- `:!...` -- запустити баш команду. Наприклад:
- `:!hexdump -C %`<kbd>Enter</kbd> -- отримати HEX-вигляд поточного файлу
- `:!python %`<kbd>Enter</kbd> -- запустити програму у пайтоні (тільки якщо неінтерактивна)
- `:vs|:term python %`<kbd>Enter</kbd> -- запустити програму у пайтоні інтерактивно
- останню команду трохи напряжно набирати, але Vim/Nvim дозволяють робити хоткеї.
Наприклад, якщо написати
`:nnoremap <F3> :w<cr>:vs<bar>:term python %<cr>`<kbd>Enter</kbd>,
то це додасть новий хоткей <kbd>F3</kbd>, який буде зберігати файл і запускати
пайтон код поруч, інтерактивно.
## ranger
`ranger` --- переглядач папок і файлів. Після запуску можна клавішами вверх вниз рухатись
по файлам в поточній папці, а клавішами вліво/вправо рухатись між батьківськими і дочірніми
папками.
Хоткеї:
- `q` --- вийти
- `?k` --- подивитись всі доступні хоткеї
- '!command` --- запустити команду в Баш
# Веселощі в терміналі
Окрім чорного екрану, в терміналі можна робити всяку веселу фігню.
## telnet, curl, asciinema
Протоколи Telnet та HTTP можна експлуатувати
- `curl parrot.live` --- мем з папугою
- `telnet mapscii.me` --- карта в терміналі. Рухатися стрілочками,
маштабуватися `a`/`z`, перемикати режим `c`, вийти `q`
- `asciinema play https://asciinema.org/a/234965` --- запустити скрінкаст
asciinema дозволяє не тільки грати файли з інтернету, а й записувати свої сскрінкасти. `asciinema -h` для допомоги
## просто весело
- `lolcat` --- розмальовує все що на вході у кольори веселки. Наприклад, `tree / | lolcat`
- `cowsay`, `cowthink` --- заставити корову говорити
- `figlet` --- перетворити текст у ASCII-арт
- `cmatrix` --- заставка з Матриці
- `pipes.sh` --- просто труби
- `pastel random` --- просто кольори
## Корисно
- `htop` --- інформація про запущені процеси і зайняті ресурси (монітор процесів)
- `ncdu /` --- інформація по розмірам файлів в системі
- `hexdump -C ...` --- вивести файл у хакерському вигляді
- `tree /home` --- показати файли і папки у вигляді ієрархії
- `tig` --- заміна `git`
- `curl 'https://google.com'` --- скачати сторінку з інтернету
- `curl 'https://google.com' > google_page` --- скачати сторінку з інтернету і зберегти у файл
- `pkill -f telnet` --- вбити всі запущені telnet програми.
Можна робити комбінації через пайпи, наприклад, `curl 'https://google.com' | hexdump -C | lolcat`