= Основные идеи командной строки =

== План ==
 * За что отвечает терминал:
  1. <- настройки отображения (цвета, шрифты, перемещения курсора, \n, \r) + -> кодирование кнопок
  2. кодировки
  3. "cooked mode" -- терминал умеет делать слабую пародию на редактирование командной строки; он может находиться в двух режимах: обычном и cooked; в cooked, он отправляет в программу не каждое нажатие, а целиком набранную строку; идея была в это место накрутить редактирование командной строки; идея не была воплощена в жизнь (слава Багу); в cooked mode работают кнопки: {{{^H}}} (он же backspace) -- стереть последнюю букву; {{{^W}}} -- стереть последнее слово; {{{^U}}} -- стереть всю строку
 . 
  * кодировки: есть своя настройка у каждого терминала; locale; настраивается через переменные среды, терминал на это особо повлиять не может; синхронизация локали с настройкой терминала -- забота пользователя
  * магические символны терминала: в таблицах termcap или terminfo; программы умеют пользоваться этими таблицами; нет стандарта, как терминал сообщает о том, что он умеет; выбор типа терминала -- снова через переменную TERM; иногда за неё снова отвечает пользователь; например, PuTTY ведёт себя немного лучше, когда в TERM прописано rxvt (у PuTTY есть соответствующая настройка)
 * Свойства процессов: их можно поглядеть в /proc/$PID; их множество; они наследуются при fork(2) и exec(3); среди них есть env и cwd (и fd); один процесс не может менять свойства другого процесса; env -- переменные среды, они выглядят как полотно вида переменная=значение
 * Главная переменная среды: PATH; в ней список директорий, в которых ищутся команды
 * За что отвечает шелл:
  * разбор командной строки -- что из этого команда, что аргументы (и поиск команды в $PATH)
  * преобразование командной строки прежде, чем исполнять, и разбиение её на слова
  * управление переменными среды
  * язык шелла должен быть полноценным языком программирования
  * удобства пользователя: редактирование командной строки, история
 ...
  * разбор строки -- в первую очередь, по пробелам (а ещё см $IFS в bash(1); про PATH уже рассказал)
  * преобразования:
   * подстановки переменных вместо $имя_переменной (подстановок с хитростями есть тыщщи разных)
   * подстановки списков имён файлов вместо шаблонов с символами: *, ?, [a-z], [abc]
   * подстановки путей к домашней директории текущего пользователя вместо ~ и пользователя по имени Петя вместо ~Петя
  * разбиение на слова:
   * по пробелам
   * есть кавычки вида " " -- всё, что в них одно слово, но внутри действуют (почти) все подстановки
   * есть кавычки вида ' ' -- внутри них никакие подстановки не действуют, и это одно слово
  * переменные среды: есть встроенная команда export var=value, после неё у всех детей шелла в среде будет ещё и переменная val иметь значение value
  * встроенные команды vs утилиты; type и which помогают определить, откуда взялась команда; может ли быть встроенной ls, cd, pwd? может ли быть отдельной утилитой ls, cd, pwd?
  * completion и history:
   * echo set editing-mode vi > ~/.inputrc
   * exec bash
   * по умолчанию вы оказываетесь в insert mode; esc -- в normal mode; работают многие из приятностей vi, например: j, k, /hello, c2e, Dpp