Редактирование: UNИX, весна 2008, 03 лекция (от 27 февраля)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 7: | Строка 7: | ||
Это то, что вы вводите в командной строке. Если вы говрите ls -s a*, то ls --- операция, -s, a* --- параметры, причём a* раскрывается в несколько параметров. | Это то, что вы вводите в командной строке. Если вы говрите ls -s a*, то ls --- операция, -s, a* --- параметры, причём a* раскрывается в несколько параметров. | ||
- | Операции могут быть двух видов: команда самого шелла, для команды никакой новый процесс запускать не надо. Второй вид --- программа. Что касается параметров, они отже двух видов: объекты и ключи. В приведённом примере параметр-объект --- file, параметр-ключ --- -s. Между ними будут разделители. Командная строка читается как предложения, предложения состоят из слов, слово --- посл. символов, не явл. разделителем. У этой команды два параметр. В чём разница? Что касается параметров-объектов, то это такие ..., это просто некие объекты для нашей программы. Для ls --- имена файлов, для которых надо выводит информацию Для echo --- объекты --- строки, которые надо вывести. Параметр-объект именует объект, с которым будет работать программа. Ключ имеет | + | Операции могут быть двух видов: команда самого шелла, для команды никакой новый процесс запускать не надо. Второй вид --- программа. Что касается параметров, они отже двух видов: объекты и ключи. В приведённом примере параметр-объект --- file, параметр-ключ --- -s. Между ними будут разделители. Командная строка читается как предложения, предложения состоят из слов, слово --- посл. символов, не явл. разделителем. У этой команды два параметр. В чём разница? Что касается параметров-объектов, то это такие ..., это просто некие объекты для нашей программы. Для ls --- имена файлов, для которых надо выводит информацию Для echo --- объекты --- строки, которые надо вывести. Параметр-объект именует объект, с которым будет работать программа. Ключ имеет умное название модификатор выполнения. ls выводит инф. о файлах, если ключей нет, то выводит только имена. Ключ -s выводит дополнительную информацию --- размер файлов в блоках. |
- | Традиционно | + | Традиционно считается, что ключи в unix начинаются на минус. Ключи бывают двух видов: однобуквенные. Чем хороши однобукв. ключи? Если исп. принцип аббревиативности (ключ начинается на ту же букву, которую ключ символизирует), то их достаточно просто запомнить и достаточно легко вписать в командную строку. Клчюей у ls много. Кроме того, можно делать несколько ключей за одним минусом: -saF. Но принцип аббревиативности тяжело соблюдать, и если он не соблюдается, то оно плохо запоминается. Поэтому ещё есть полнословные ключи, gnu-style. Они предваряются двумя минусами и за ними идут слова. Писать всё это безобразие руки отвалятся, но понятно, что если написано –long, то понятно, о чёми речь, а если -l, то не сразу. В силу того, что есть большое количество библиотек для разбора командной строки, имеют и такие, и сяки ключи. Но большинство это не значит все, и есть программы, которые не работают с полнословными ключами. Итак, когда мы выводим команду, она является некоей операцией, остальное будут параметрами, ключи бывают тоже двух видов. Лектор надеется в ближайшее время делать страничку, посвящённую лекциям, и там он сошлётся на учебник, где есть больше. Этот вопрос пока закрыли. |
- | . Итак, когда мы выводим команду, она является некоей операцией, остальное будут параметрами, ключи бывают тоже двух видов. Лектор надеется в ближайшее время делать страничку, посвящённую лекциям, и там он сошлётся на учебник, где есть больше. Этот вопрос пока закрыли. | + | |
- | Лектор хочет | + | Лектор хочет рассм. тему, связанну с перенаправленим ввода-вывода. Просто здесь, по нормальному плану, надо бросить всё и рассказать про то, как ман читать. Но сегодня всё-таки про терминалы. |
- | Дело в том, что некоторые символы в командной строке интерпретируются самим шеллом и не | + | Дело в том, что некоторые символы в командной строке интерпретируются самим шеллом и не явл. командой в командной строке. На самом деле шелл разделяет символы на три класса: разделители, неспециальные символы, специальные символы. Один символ лектор уже упомянул, это символ *. Чтобы немного докончить тему с процессами и терминалами, рассм. неск. символов, которые правляют перенапр. ввода-вывода. |
Когда ОС запускает опр. программу, у этой программы сразу доступно три потока данных, одно на ввод и два на вывод. Есть стандартный ввод, stdin, поток данных номер 0; стандартный вывод? stdout --- поток данных 1; stderr --- 2. С ними можно работать как с файлами. Поскольку манипуляция с потоками данных есть наиболее ффективный способ организации работы программ, то шелл должен это уметь. Любая программа имеет три потока данных. Для тех, кто это проходил, не секрет, что три этих дескриптора прото налседуются, поскольку там случилса fork, потом exec. Но, слава богк, когда программа выполняется в активном режиме, всё происходит не так: делается форк, получается два шелла, отличающиеся только результатом форка. Потомок запускает программу, в это время поток-папа выполняет wait(), и ждёт завершения. Это не вполне похоже на то, как мы могли бы себе представить. Можно было бы подумать, что есть специальный вызов «запустить программу», но это было бы неудобно. | Когда ОС запускает опр. программу, у этой программы сразу доступно три потока данных, одно на ввод и два на вывод. Есть стандартный ввод, stdin, поток данных номер 0; стандартный вывод? stdout --- поток данных 1; stderr --- 2. С ними можно работать как с файлами. Поскольку манипуляция с потоками данных есть наиболее ффективный способ организации работы программ, то шелл должен это уметь. Любая программа имеет три потока данных. Для тех, кто это проходил, не секрет, что три этих дескриптора прото налседуются, поскольку там случилса fork, потом exec. Но, слава богк, когда программа выполняется в активном режиме, всё происходит не так: делается форк, получается два шелла, отличающиеся только результатом форка. Потомок запускает программу, в это время поток-папа выполняет wait(), и ждёт завершения. Это не вполне похоже на то, как мы могли бы себе представить. Можно было бы подумать, что есть специальный вызов «запустить программу», но это было бы неудобно. |