Для взаимодействия человека с компьютером кроме графического интерфейса одним из часто используемых является текстовый. В этом случае пользователь выводит текст с помощью клавиатуры и видит также символьную информацию где-то на экране.
Текстовый интерфейс может содержать меню и окна, реализованные с помощью "псевдографики", в этом случае сценарии использования похожи на работу с
GUI. Альтернативой является интерфейс командной строки (command-line interface, CLI), когда пользователь вводит команды, а потом наблюдает ответ, а весь вывод представлен в виде постоянно прокручивающегося текста.На уровне ОС это реализовано в виде многоуровневой системы. На примере Linux "обычная командная строка" это на самом деле несколько вещей:
1. Объект ядра, представляющий устройство терминала. Реальное (
/dev/ttyX) или виртуальное (псевдо-терминал, /dev/pts/X). Ядро передает байты между работающей прикладной программой и тем местом, где реально идёт взаимодействие с юзером. 2. Терминал.
• Экран и клавиатура в случае физического терминала, подключенные в соответствующие порты компа.
• Программа-эмулятор виртуального терминала. Это не часть ядра, а именно отдельное приложение, работающее в пространстве пользователя. Она может выводить текст в окне внутри графического интерфейса, другого терминала, перенаправлять ввод вывод в сеть, эмулировать пользователя или делать всё, на что хватит фантазии автора. Примеры:
xterm, konsole, gnome terminal, tmux, ssh.3. Прикладная программа, организующая интерфейс пользователя. Как правило, первое, что мы видим - это командная оболочка. Это программа, реализующая сценарии CLI, которая умеет понимать команды пользователя (те самые
cd, ls, pwd). По факту, это интерпретатор, который взаимодействует с терминалом и умеет запускать другие программы. Примеры: bash, sh, но ещё есть csh, ash или можно вообще тут использовать произвольную "консольную программу".Чтобы прикладная программа могла взаимодействовать с устройством терминала (реальным или виртуальным), ей передаются стандартные потоки ввода-вывода:
• стандартный поток ввода (
stdin, номер 0) - входные данные• стандартный поток вывода (
stdout, номер 1) - предназначен для основного вывода программы• стандартный поток ошибок (
stderr, номер 2) - предназначен для вывода отладочной информации и ошибокТаким образом,
1. пользователь взаимодействует с физическим устройством или программой-эмулятором терминала.
2. они передают информацию ядру ОС,
3. которое дальше через стандартные потоки ввода-вывода организует взаимодействие с прикладной программой.
Во многих случаях, запуская консольную программу мы можем в качестве стандартных потоков ввода-вывода использовать файлы, пайпы или потоки других программ.
Например, если мы запускаем программу из
bash, так мы можем перенаправить stdout программы в файл echo "hello" > file.log
А так перенаправить вывод одной программы (
ls) на ввод другой (grep). (Параметр -l здесь не имеет отношения к перенаправлению, он задан для придания смысла действиям)ls -l | grep .txt
Более детально вы можете посмотреть в документации к вашей командной оболочке.
Дополнительные материалы:
• https://habr.com/ru/post/417679/
• https://habr.com/ru/post/460257/
• https://linux.die.net/man/3/daemon
• https://www.baeldung.com/linux/pty-vs-tty
• https://ru.wikipedia.org/wiki/Управляющие_последовательности_ANSI