|
@@ -0,0 +1,70 @@
|
|
|
+# UNIXWAY: Everything is a file, streams, pipes, sockets. Commandline vs GUI, automation
|
|
|
+
|
|
|
+Как было уже рассмотрено на прошлом занятии, в **UNIX**-системах большое внимание уделено гибкости файлового дерева, которое
|
|
|
+может включать в себя множество разных файловых систем для разных целей - как дисковых, так и виртуальных. Ко всему прочему
|
|
|
+CLI содержит в себе достаточно гибкий инструментарий для оперирования данными в файлах. Файлы же, в свою очередь, могут
|
|
|
+быть отображением *любой информации*, включая практичеки любые настройки операционной системы.
|
|
|
+Все это дает гибкий и мощный инструментарий для автоматизации и управления операционной системой.
|
|
|
+
|
|
|
+## Понятие потока/сокета. Применение в **POSIX**.
|
|
|
+
|
|
|
+Потоки, сокеты и пайпы (каналы) - схожие понятия, суть которых в абстракции **потока данных**. Поток предоставляет
|
|
|
+данные порциями для обработки, и, обычно, не позволяет доступ в случайном порядке. Потоки ввода-вывода - однонаправленные,
|
|
|
+сокет, обычно, состоит из двух потоков. Сокеты обычно используются для сетевых соединений.
|
|
|
+
|
|
|
+С точки зрения **POSIX** (стандарт **UNIX**-систем) все эти сущности, как в сети, так и в случае потоков ввода-вывода, работают
|
|
|
+схоже (или одинаково), что облегчает и унифицирует программирование потоков, и позволяет гибко перенаправлять локальные потоки
|
|
|
+в сеть или в любому другому получателю, который готов воспринимать потоковые данные.
|
|
|
+
|
|
|
+## Потоки ввода-вывода.
|
|
|
+
|
|
|
+У каждой программы, работающей с CLI (а это по умолчанию все в **UNIX**), есть три потока:
|
|
|
+- **Поток ввода**. По умолчанию связан с вводом пользователя с клавиатуры. Однако его можно *перенаправить*.
|
|
|
+- **Поток вывода**. То, что выводит программа на терминал. Все основные консольные команды типа `cat` и `ls` выводят полезную информацию в поток вывода.
|
|
|
+- **Поток ошибок**. Это, по большому счету, тоже поток вывода, который по умолчанию отправляется туда же, куда и основной поток вывода - на экран терминала. Однако ошибки могут быть *перенаправлены* *отдельно* в другом направлении, так как это отдельный полноправный поток.
|
|
|
+
|
|
|
+## Перенаправление ввода-вывода.
|
|
|
+
|
|
|
+ - `>` - перенаправление вывода программы в файл
|
|
|
+ - `>>` - дописывает в файл.
|
|
|
+ - `<` - перенаправления файла на поток ввода
|
|
|
+ - `|` - перенаправление потока вывода одной программы на другой.
|
|
|
+
|
|
|
+## Коды ошибок и `&&`, `||`.
|
|
|
+
|
|
|
+Ко всему прочему, каждая программа в рамках **CLI** может вести себя как **функция** - имеет код результата, который обычно передается из программы с помощью функции `exit`. Код числовой, 0 означает что все хорошо,
|
|
|
+иные значение - ту или иную ошибку. Это можно использовать в условиях и циклах оболочки. Значение ошибки доступно в переменной `$?` интерпретатора.
|
|
|
+
|
|
|
+### `&&` и `||`
|
|
|
+
|
|
|
+В отличие от **PHP**, во многих языках логические **И** и **ИЛИ** работают не только в логическом, но и в бытовом смысле: **И** работает до первой неудачи, **ИЛИ** работает до первой удачи.
|
|
|
+Под 'удачей' или 'неудачей' понимается код ошибки, возвращенный из программы:
|
|
|
+
|
|
|
+```sh
|
|
|
+git commit -am 'text' && git push # сделать коммит, И, если он удачный (код ошибки === 0), сделать git push
|
|
|
+```
|
|
|
+
|
|
|
+```sh
|
|
|
+reboot || shutdown -h now # перезагрузить ИЛИ выключить. Если reboot не срабатывает - запускается shutdown -h now
|
|
|
+```
|
|
|
+
|
|
|
+### `;`
|
|
|
+
|
|
|
+Объединяет несколько команд в одну строку не обращая внимания на коды ошибок.
|
|
|
+
|
|
|
+
|
|
|
+## Фильтры (`sort`, `uniq`, `grep`, `sed`, `cut`, `wc` ...)
|
|
|
+
|
|
|
+**TODO**
|
|
|
+
|
|
|
+## Всё есть файл и что это даёт.
|
|
|
+
|
|
|
+показать всякие приколяхи `/sys` и `/proc`. Там можно найти яркость, громкость и прочие штуки.
|
|
|
+
|
|
|
+## Сокеты в файловой системе и сетевые.
|
|
|
+
|
|
|
+https://en.wikipedia.org/wiki/Unix_domain_socket
|
|
|
+
|
|
|
+## Базовый скриптинг и автоматизация.
|
|
|
+
|
|
|
+шо-то взять и погрепать. пошукать по файлам PHP проекта и найти. и т. п.
|