Основные идеи командной строки
План
- За что отвечает терминал:
<- настройки отображения (цвета, шрифты, перемещения курсора, \n, \r) + -> кодирование кнопок
- кодировки
"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