= Основные идеи командной строки = == План == * За что отвечает терминал: 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