Консоль программирование это что

Console Класс

Определение

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Предоставляет стандартные потоки для консольных приложений: входной, выходной и поток сообщений об ошибках. Этот класс не наследуется.

Примеры

В следующем примере показано, как считывать данные из стандартных входных и выходных потоков и записывать их в них. Обратите внимание, что эти потоки можно перенаправить с SetIn помощью SetOut методов и.

Комментарии

Консоль — это окно операционной системы, в котором пользователи взаимодействуют с операционной системой или текстовым консольным приложением, вводя ввод текста с помощью клавиатуры компьютера и считывая текстовые данные из терминала компьютера. например, в Windows операционной системе консоль называется окном командной строки и принимает команды MS-DOS. ConsoleКласс предоставляет базовую поддержку для приложений, считывающих символы из и записывающих символы в консоль.

Сведения о разработке с помощью Console класса см. в следующих разделах:

Потоки ввода-вывода консоли

Не используйте Console класс для вывода выходных данных в автоматических приложениях, таких как серверные приложения. Вызовы методов, таких как Console.Write и, Console.WriteLine не влияют на приложения GUI.

Console члены класса, работающие нормально, когда базовый поток направляется на консоль, могут вызывать исключение, если поток перенаправляется, например, в файл. Запрограммировать приложение для перехвата System.IO.IOException исключений при перенаправлении стандартного потока. Кроме того, можно использовать IsOutputRedirected IsInputRedirected свойства, и, IsErrorRedirected чтобы определить, перенаправляется ли стандартный поток перед выполнением операции, вызывающей System.IO.IOException исключение.

Эту проблему можно решить, установив TextWriter.NewLine свойство Out или в Error другую строку завершения строки. Например, следующая инструкция C# задает строку завершения строки для стандартного потока вывода ошибок в два символа возврата каретки и перевода строки:

Затем можно явно вызвать WriteLine метод объекта потока вывода ошибок, как показано в следующей инструкции C#:

Буфер экрана и окно консоли

Двумя тесно связанными функциями консоли являются буфер экрана и окно консоли. Текст на самом деле считывается из потоков, принадлежащих консоли, и записывается в нее, но читается или записывается в область, принадлежащую консоли, которая называется буфером экрана. Буфер экрана является атрибутом консоли и организован в виде прямоугольной сетки строк и столбцов, где каждое пересечение сетки или символьная ячейка может содержать символ. Каждый символ имеет собственный цвет переднего плана, а каждая символьная ячейка имеет собственный цвет фона.

Буфер экрана просматривается через прямоугольную область, называемую окном консоли. Окно консоли — это еще один атрибут консоли; Это не сама консоль, которая является окном операционной системы. Окно консоли упорядочивается по строкам и столбцам, меньше или равно размеру буфера экрана и может быть перемещено для просмотра различных областей базового буфера экрана. Если буфер экрана больше, чем окно консоли, консоль автоматически отображает полосы прокрутки, чтобы окно консоли можно было переместить в область буфера экрана.

Курсор указывает позицию буфера экрана, в которой текст в данный момент считывается или записывается. Курсор можно скрыть или сделать видимым, и его высоту можно изменить. Если курсор является видимым, то расположение окна консоли перемещается автоматически, поэтому курсор всегда находится в представлении.

Поддержка Юникода для консоли

Как правило, консоль считывает ввод и запись выходных данных с помощью текущей кодовой страницы консоли, которую по умолчанию определяет языковой стандарт системы. Кодовая страница может обрабатывать только подмножество доступных символов Юникода, поэтому при попытке отобразить символы, не сопоставленные определенной кодовой страницей, консоль не сможет отобразить все символы или представить их точно. Приведенный ниже пример иллюстрирует данную проблему. Он пытается отобразить символы кириллицы в алфавите от U + 0410 до U + 044F в консоли. Если запустить пример в системе, которая использует кодовую страницу консоли 437, каждый символ заменяется вопросительным знаком (?), поскольку символы кириллицы не сопоставляются с символами в кодовой странице 437.

Для поддержки символов Юникода кодировщику необходимо распознать определенный символ Юникода, а также шрифт, который содержит глифы, необходимые для визуализации этого символа. Для успешного вывода символов Юникода на консоль в качестве шрифта консоли необходимо задать нерастровый или TrueType-шрифт, такой как consolas или ЛуЦида Console. В следующем примере показано, как можно программным способом изменить шрифт с растрового шрифта на консоль ЛуЦида.

Однако шрифты TrueType могут отображать только подмножество глифов. Например, шрифт консоли ЛуЦида отображает только 643 из приблизительно 64 000 символов от U + 0021 до U + FB02. Чтобы узнать, какие символы поддерживает конкретный шрифт, откройте приложение шрифты на панели управления, выберите параметр найти символ и выберите шрифт, набор символов которого необходимо проверить в списке Шрифт окна » Таблица символов «.

Windows использует связывание шрифтов для вывода глифов, недоступных в определенном шрифте. Дополнительные сведения о связывании шрифтов для вывода дополнительных наборов символов см. в разделе глобализация пошаговых действий: шрифты. Связанные шрифты определяются в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink подразделе реестра. Каждая запись, связанная с этим подразделом, соответствует имени базового шрифта, а его значение — массив строк, который определяет файлы шрифтов и шрифты, связанные с базовым шрифтом. Каждый член массива определяет связанный шрифт и принимает форму Font-File-Name и Font-Name. В следующем примере показано, как программным способом определить связанный шрифт с именем SimSun, найденный в файле шрифтов с именем simsun. ТТК, который отображает упрощенные символы типа «символ».

Поддержка Юникода для консоли имеет следующие ограничения.

Кодировка UTF-32 не поддерживается. Поддерживаются только кодировки Юникода UTF-8 и UTF-16, которые представлены UTF8Encoding UnicodeEncoding классами и соответственно.

Двунаправленный вывод не поддерживается.

Отображение символов за пределами базовой многоязычной плоскости (т. е. суррогатных пар) не поддерживается, даже если они определены в связанном файле шрифта.

Отображение символов в сложных скриптах не поддерживается.

Объединение последовательностей символов (то есть символов, которые состоят из базового символа и одного или нескольких Объединенных символов), отображается в виде отдельных символов. Чтобы обойти это ограничение, можно нормализовать строку для отображения, вызвав String.Normalize метод перед отправкой выходных данных в консоль. В следующем примере строка, содержащая объединенную последовательность символов U + 0061 U + 0308, отображается в консоли как два символа до нормализации выходной строки и как один символ после String.Normalize вызова метода.

Обратите внимание, что нормализация является приемлемым решением, только если Стандарт Юникода для символа содержит предварительно сформированную форму, соответствующую определенной последовательности Объединенных символов.

Если шрифт содержит глиф для кодовой точки в области личных использований, этот глиф будет отображаться. Однако, поскольку символы в частной области использования относятся к конкретному приложению, это может быть не ожидаемый глиф.

В следующем примере на консоль выводится диапазон символов Юникода. Пример принимает три параметра командной строки: начало отображаемого диапазона, конец отображаемого диапазона и необходимость использования текущей кодировки консоли ( false ) или кодировки UTF-16 ( true ). Предполагается, что в консоли используется шрифт TrueType.

Общие операции

ConsoleКласс содержит следующие методы для чтения входных данных консоли и записи вывода на консоль:

Перегрузки ReadKey метода считывают отдельный символ.

ReadLineМетод считывает всю строку входных данных.

WriteПерегрузки метода преобразуют экземпляр типа значения, массив символов или набор объектов в форматированную или неформатированную строку, а затем записывают эту строку в консоль.

Параллельный набор WriteLine перегрузок метода выводит ту же строку, что и Write перегрузки, но также добавляет строку завершения строки.

ConsoleКласс также содержит методы и свойства для выполнения следующих операций:

Возвращает или задает размер буфера экрана. BufferHeightСвойства и BufferWidth позволяют получить или задать высоту и ширину буфера соответственно, а SetBufferSize метод позволяет задать размер буфера в одном вызове метода.

Возвращает или задает размер окна консоли. WindowHeightСвойства и WindowWidth позволяют получить или задать высоту и ширину окна соответственно, а SetWindowSize метод позволяет задать размер окна в одном вызове метода.

Возвращает или задает размер курсора. CursorSizeСвойство задает высоту курсора в ячейке символа.

Возвращает или задает расположение окна консоли относительно буфера экрана. WindowTopСвойства и WindowLeft позволяют получить или задать верхнюю строку и крайний левый столбец буфера экрана, который отображается в окне консоли, а SetWindowPosition метод позволяет задать эти значения в одном вызове метода.

Переместите или очистите данные в буфере экрана, вызвав MoveBufferArea Clear метод или.

Возвращает или задает цвет переднего плана и фона с помощью ForegroundColor BackgroundColor свойств и или сбросьте фон и передний план на цвет по умолчанию, вызвав ResetColor метод.

Воспроизведение звука звукового сигнала с помощью динамика консоли путем вызова Beep метода.

Если приложение зависит от конкретных кодировок кодовых страниц, вы все равно можете сделать их доступными, выполнив следующие действия перед вызовом Console методов.

Добавьте в проект ссылку на сборку System.Text.Encoding.CodePages.dll.

Передайте объект EncodingProvider в метод Encoding.RegisterProvider, чтобы сделать доступными дополнительные кодировки, поддерживаемые поставщиком кодировки.

ConsoleКласс будет автоматически использовать системную кодировку по умолчанию, а не UTF8, при условии, что поставщик кодирования зарегистрирован до вызова Console методов вывода.

Свойства

Возвращает или задает цвет фона консоли.

Возвращает или задает высоту буферной области.

Возвращает или задает ширину буферной области.

Возвращает значение, указывающее, включен или отключен режим CAPS LOCK клавиатуры.

Возвращает или задает позицию столбца курсора в буферной области.

Возвращает или задает высоту курсора в символьной ячейке.

Возвращает или задает позицию строки курсора в буферной области.

Возвращает или задает значение, указывающее, видим ли курсор.

Возвращает стандартный выходной поток сообщений об ошибках.

Возвращает или задает цвет фона консоли.

Возвращает стандартный входной поток.

Возвращает или задает кодировку консоли, используемую при чтении входных данных.

Получает значение, показывающее, был ли перенаправлен выходной поток ошибок от стандартного потока ошибок.

Получает значение, показывающее, был ли перенаправлены ли входные данные от стандартного входного потока.

Получает значение, показывающее, был ли перенаправлены выходные данные от стандартного выходного потока.

Возвращает или задает значение, указывающее, доступно ли нажатие клавиши во входном потоке.

Возвращает максимальное число строк окна консоли с учетом текущего шрифта и разрешения экрана.

Возвращает максимальное число столбцов окна консоли с учетом текущего шрифта и разрешения экрана.

Возвращает значение, указывающее, включен или отключен режим NUM LOCK клавиатуры.

Возвращает стандартный выходной поток.

Получает или задает кодировку консоли, используемую при записи выходных данных.

Возвращает или задает заголовок для отображения в строке заголовка консоли.

Получает или задает значение, указывающее, интерпретируется ли комбинация клавиши-модификатора Control и клавиши консоли C (Ctrl+C) как обычный ввод или как прерывание, которое обрабатывается операционной системой.

Возвращает или задает высоту области окна консоли.

Возвращает или задает позицию левого края области окна консоли относительно буфера экрана.

Возвращает или задает позицию верхнего края области окна консоли относительно буфера экрана.

Возвращает или задает ширину окна консоли.

Методы

Воспроизводит звуковой сигнал через динамик консоли.

Воспроизводит звуковой сигнал заданной частоты и длительности через динамик консоли.

Удаляет из буфера консоли и ее окна отображаемую информацию.

Возвращает положение курсора.

Копирует заданную исходную область буфера экрана в заданную область назначения.

Копирует заданную исходную область буфера экрана в заданную область назначения.

Получает стандартный поток сообщений об ошибках.

Получает стандартный поток сообщений об ошибках, для которого установлен заданный размер буфера.

Получает стандартный входной поток.

Получает стандартный входной поток, для которого установлен заданный размер буфера.

Получает стандартный выходной поток.

Получает стандартный выходной поток, для которого установлен заданный размер буфера.

Читает следующий символ из стандартного входного потока.

Получает следующий нажатый пользователем символ или функциональную клавишу. Нажатая клавиша отображается в окне консоли.

Получает следующий нажатый пользователем символ или функциональную клавишу. Нажатая клавиша может быть отображена в окне консоли.

Считывает следующую строку символов из стандартного входного потока.

Устанавливает для цветов фона и текста консоли их значения по умолчанию.

Устанавливает заданные значения высоты и ширины буферной области экрана.

Устанавливает положение курсора.

Присваивает свойству Error указанный объект TextWriter.

Присваивает свойству In указанный объект TextReader.

Присваивает свойству Out указанный объект TextWriter.

Задает позицию окна консоли относительно буфера экрана.

Устанавливает заданные значения высоты и ширины окна консоли.

Записывает текстовое представление заданного логического значения в стандартный выходной поток.

Записывает значение заданного знака Юникода в стандартный выходной поток.

Записывает заданный массив знаков Юникода в стандартный выходной поток.

Записывает заданный дочерний массив знаков Юникода в стандартный выходной поток.

Записывает текстовое представление заданного значения Decimal в стандартный выходной поток.

Записывает текстовое представление заданного значения двойной точности с плавающей запятой в стандартный выходной поток.

Записывает текстовое представление заданного 32-битового целого числа со знаком в стандартный поток вывода.

Записывает текстовое представление заданного 64-битового целого числа со знаком в стандартный поток вывода.

Записывает текстовое представление заданного объекта в стандартный выходной поток.

Записывает текстовое представление заданного значения одинарной точности с плавающей запятой в стандартный выходной поток.

Записывает заданное строковое значение в стандартный выходной поток.

Записывает текстовое представление заданного объекта в стандартный выходной поток, используя заданные сведения о форматировании.

Записывает текстовые представления заданных объектов в стандартный выходной поток, используя заданные сведения о форматировании.

Записывает текстовые представления заданных объектов в стандартный выходной поток, используя заданные сведения о форматировании.

Записывает текстовое представление заданных объектов и список параметров переменной длины в стандартный выходной поток, используя заданные сведения о форматировании.

Записывает текстовое представление заданного массива объектов в стандартный выходной поток, используя заданные сведения о форматировании.

Записывает текстовое представление заданного 32-битового целого числа без знака в стандартный выходной поток.

Записывает текстовое представление заданного 64-битового целого числа без знака в стандартный выходной поток.

Записывает текущий признак конца строки в стандартный выходной поток.

Записывает текстовое представление заданного логического значения с текущим признаком конца строки в стандартный выходной поток.

Записывает заданный знак Юникода, за которым следует текущий признак конца строки, в стандартный выходной поток.

Записывает заданный массив знаков Юникода, за которым следует текущий признак конца строки, в стандартный выходной поток.

Записывает заданный подмассив знаков Юникода, за которым следует текущий признак конца строки, в стандартный выходной поток.

Записывает текстовое представление указанного значения Decimal, за которым следует текущий знак завершения строки, в стандартный выходной поток.

Записывает текстовое представление заданного значения двойной точности с плавающей запятой, за которым следует признак конца строки, в стандартный выходной поток.

Записывает текстовое представление заданного 32-битового целого числа со знаком, за которым следует текущий знак завершения строки, в стандартный выходной поток.

Записывает текстовое представление заданного 64-битового целого числа со знаком, за которым следует текущий знак завершения строки, в стандартный поток вывода.

Записывает текстовое представление заданного объекта, за которым следует текущий признак конца строки, в стандартный выходной поток.

Записывает текстовое представление заданного значения одинарной точности с плавающей запятой, за которым следует признак конца строки, в стандартный выходной поток.

Записывает заданное строковое значение, за которым следует текущий признак конца строки, в стандартный выходной поток.

Записывает текстовое представление заданного объекта, за которым следует текущий признак конца строки, в стандартный выходной поток с использованием заданных сведений о форматировании.

Записывает текстовые представления заданных объектов, за которыми следует текущий признак конца строки, в стандартный выходной поток с использованием заданных сведений о форматировании.

Записывает текстовые представления заданных объектов, за которыми следует текущий признак конца строки, в стандартный выходной поток с использованием заданных сведений о форматировании.

Записывает текстовые представления заданных объектов и список параметров переменной длины, за которыми следует текущий признак конца строки, в стандартный выходной поток с использованием заданных сведений о форматировании.

Записывает текстовые представления заданного массива объектов, за которым следует текущий признак конца строки, в стандартный выходной поток с использованием заданных сведений о форматировании.

Записывает текстовое представление заданного 32-битового целого числа без знака, за которым следует текущий признак конца строки, в стандартный выходной поток.

Записывает текстовое представление заданного 64-битового целого числа без знака, за которым следует текущий признак конца строки, в стандартный выходной поток.

События

Возникает при одновременном нажатии клавиши-модификатора Control (Ctrl) и либо клавиши консоли C (C), либо клавиши Break (Ctrl+C или Ctrl+Break).

Источник

Консольный ввод-вывод информации с примерами на C# и Windows Terminal

Консольный ввод-вывод информации с примерами на C#

Консоль программирование это что. Смотреть фото Консоль программирование это что. Смотреть картинку Консоль программирование это что. Картинка про Консоль программирование это что. Фото Консоль программирование это что

Понятие консоли и Windows Terminal

Консоль (Console)- характерная особенность ранних операционных систем (например, MS DOS), использующих интерфейс командной строки для интерактивного обмена информацией с пользователем. Консольные приложения используются и сейчас. По сравнению с графическим интерфейсом, интерфейс командной строки требует меньше системных ресурсов и предоставляет инструменты автоматизации для повторяющихся задач.

Наиболее яркими примерами интерфейсов командной строки (англ. Command line interface, CLI) являются: Командная оболочка Windows, PowerShell, а также Bash, доступная на всех платформах (наибольшее распространение Bash получил в Unix-системах и Mac, присутствует также в компонентах Подсистема Windows для Linux (англ. Windows Subsystem for Linux, WSL)).

В операционной системе Windows консоль называется окном командной строки, для вызова которой Вы можете пройти в меню Пуск — Командная строка. В 2019 году компания Micrsoft также представила Windows Terminal — современное консольное приложение для пользователей инструментов и оболочек командной строки, таких как Command Prompt, PowerShell и WSL.

Форма интерфейсов командной строки используется в основном для обработки сценариев команд с использованием последовательности операций чтения (для принятия данных путем ввода текстовой информации пользователем) и операций записи (в вывод консоли, для отображения результатов обратной связи).

Программный способ записи в вывод консоли

Для вывода информации на консоль применяются 2 ключевых метода класса Console — C onsole.WriteLine и Console.Write, отличие которых заключается в том, что WriteLine самостоятельно добавляет терминатор строки (разделитель строки) ко всему, что вы записали. Использование метода Write предполагает ручное разбиение строки на несколько путем добавления в запись вывода терминатора строки, где это необходимо.

Записывает указанные данные с текущим признаком конца строки в стандартный выходной поток.

Console.WriteLine(“Hello, World!”);
Console.WriteLine(“=Second Line=”);

Результатом вывода будет две строки.

Записывает текстовое представление заданного значения или значений в стандартный выходной поток без признака конца строки.

Console.Write(“Hello,”);
Console.Write(“ “);
Console.Write(“World!”);
Console.Write(Environment.NewLine);
Console.Write(“=Second Line=”);

Результат вывода этого примера идентичен.

Программный способ ввода информации с консоли

Как и запись в вывод, класс Console предоставляет различные методы для чтения ввода от пользователя.

Метод Console.ReadLine

Считывает набор символов до тех пор, пока не найдет признак окончания или новой строки, и возвращает все, что он считает, как строковое значение.

Console.WriteLine(“What is your name?”);
string response = Console.ReadLine();
Console.WriteLine(“Hello, “ + response+“!“);

Метод Console.Read

Считывает следующий символ в строке и возвращает его как код целочисленного символа.

Console.WriteLine(“Please, type anything: “);
int value = Console.Read();
Console.Write(“You typed: “ + (char)value);

Метод Console. ReadKey

ConsoleKeyInfo описывает нажатую клавишу, включая символ, представленный этой клавишей, и состояние управляющих клавиш-модификаторов (например, Shift, Alt и др.). Нижеследующий пример ожидает нажатия клавиши Enter.

Источник

Программирование в консоли

Консоль программирование это что. Смотреть фото Консоль программирование это что. Смотреть картинку Консоль программирование это что. Картинка про Консоль программирование это что. Фото Консоль программирование это что

Зачем сегодняшнему разработчику нужны навыки программирования в консоли? Да затем же, зачем воину базовые навыки рукопашного и выживания.

Уйду от аналогий, и назову такие причины:

Screen (или Tmux)

Первый инструмент, который мы рассмотрим, — screen. Он играет ту же роль, что оконный менеджер в мире GUI: управляет несколькими приложениями, позволяя переключаться с одного на другое. В консольной вселенной такие инструменты называются терминальными мультиплексорами. Пожалуй, из всех оконных менеджеров ближе всего к screen будет легендарный ratpoison, позволяющий обходиться одной лишь клавиатурой, без мыши.

Пример: запускаем screen, видим баннер с предложением нажать пробел или ввод для продолжения работы. Воспользуемся любезным предложением — баннер исчезает, мы снова в терминале. Открываем в Vim (про него будет дальше) файл main.cpp.

Не хотелось бы превращать статью в сборник переводов man’ов, поэтому приведу здесь только самые нужные в повседневной практике команды и аккорды (здесь и далее, говоря о screen, начальный аккорд Ctrl ^ a я для краткости буду опускать):

Регион можно еще раз разделить напополам, потом еще, и так до тех пор, пока будет хватать высоты экрана.

Ну и чтобы закончить со screen, упомяну про отключение. Screen завершается, когда закрывается последнее из его окон. Кроме того, можно выйти из screen, оставив все окна работающими в фоне, командой : detach (также на эту команду по умолчанию назначена клавиша d ). Позднее к этому сеансу screen можно будет подключиться снова. Обычно такая фича полезна при работе с удаленной машиной.

И совсем напоследок: случается, что мантейнеры дистрибутива или пользователь конкретной системы меняют одну или несколько клавиатурных комбинаций по умолчанию (в моем опыте была чехарда с клавишей X при переходе с RHEL6 на Debian). Смотри конфигурационные файлы screenrc и, конечно, кури доки (специально для РКН: я в переносном смысле).

Vim: великий и могучий

Кстати, почему Vim, а не Emacs? Поклонники последнего могут закидать меня гнилыми помидорами, но вот не пошел он у меня почему-то, хотя я и старался. Кроме того, по моему субъективному опыту, Vim, точнее его предок, Vi, идет «из коробки» на большинстве современных Linux-систем: встроенных, настольных, серверных. Приятно везде чувствовать себя как дома.

Интерфейс Vim модальный (отец современного UI Джеффри Раскин переворачивается в гробу) и может находиться в двух режимах (вообще-то их больше, но нам пока хватит этих двух): режиме вставки и командном режиме.

После запуска Vim будет в командном режиме: все введенное с клавиатуры считается командами. Самые распространенные команды привязаны к различным клавиатурным комбинациям, менее частые вводятся в командной строке (в терминологии Vim это считается отдельным режимом и называется режимом командной строки).

Сразу бросается в глаза, что создатели Vim считают основным командный режим. При этом большая часть вводимых команд — составные, то есть состоят (или могут состоять) из нескольких частей: числа повторов, действия и позиции.

Чем иногда бывает удобен «мышиный» интерфейс, так это возможностью быстро переместить курсор в середину текста: щелк — и готово. Но и тут Vim есть чем ответить: команды перемещения в конец слова, предложения, абзаца, быстрое перемещение по номеру строки ( : номер-строки ), переход по поиску ( /шаблон ). В качестве шаблона поиска может использоваться и точное совпадение, и регулярное выражение. Регулярные выражения в Vim действительно хороши, лучше, по-моему, только регулярки Perl.

Vim поддерживает концепции областей экрана, аналогичных регионам screen (в терминологии Vim эти области называются окнами), вкладок (тут объяснять ничего не требуется) и буферов — не обязательно имеющих визуальное представление, возможно отображение на множество вкладок или окон.

По-настоящему крутая возможность Vim — интеграция с утилитами командной оболочки:

Например, мы хотим найти в исходниках ядра Linux все файлы, которые имеют какое-либо отношение к mmc:

Если этот «файлнайдись» тебе не совсем понятен:

Теперь ПК с полминуты пошуршит диском и вставит в окно с полторы сотни файлов.

Сразу же можем удалить из списка файлы из каталогов Documentation и tools:

Это уже режим командной строки. Вот объяснение «на пальцах» конкретно этой команды: d, очевидно, означает delete, то есть удалить (строку); 115,142 — начальный и конечный адреса применения команды. В качестве адреса может использоваться номер строки или регулярное выражение.

: 44 — переходим в строку с нужным номером, теперь нажимаем gf (легко запомнить: go-file).

Теперь, предположим, мы хотим найти все места, где используются функции из целевого файла. Для этого возьмем утилиту командной оболочки grep, а ее результат прочитаем в новое окно Vim:

Прекращая «дозволенные речи» ©, традиционно рекомендую читать доки (в Vim есть встроенный help, вызываемый из режима командной строки : help ) и другую литературу. По Vim написано уже много отличных статей, в том числе и на ][акере, и книг. «Практическое использование Vim» Дрю Нейла, пожалуй, лучшая из всех, которые мне попадались.

Конвейеры

Ты наверняка слышал про «философию UNIX», которая учит нас, что программа должна делать только одно дело, зато хорошо. Для решения сложных задач небольшие специализированные приложения нужно соединить между собой и заставить взаимодействовать.

Есть три типовых способа взаимодействия программ в командной оболочке: стандартные потоки ввода-вывода, аргументы командной строки и переменные окружения. При запуске программа разбирает аргументы и переменные окружения, настраивая в соответствии с ними свое поведение, после чего читает данные со стандартного входа (а иногда еще из некоторых других файлов на диске) и выводит результаты в стандартный выход. «В любой непонятной ситуации» (c) программа выводит сообщение об ошибке в стандартный поток ошибок. Для соединения программ командная оболочка предоставляет нам следующие средства:

Из всех утилит, которыми GNU облагодетельствовали человечество, программисту чаще всего нужны следующие:

Ладно, это все теория, пора и к практике. Первый случай — применение конвейера. Выше мы уже видели пример чтения стандартного выхода утилиты find в Vim. Вот те же самые Фаберже, вид сбоку:

Хорошо, но список файлов сам по себе нам, скорее всего, не нужен. Как правило, нам требуется открыть эти файлы в текстовом редакторе:

Формально оно, конечно, так, но, как правило, такие имена не используют даже те программисты, которые пишут комментарии кириллицей, а идентификаторы транслитом.

Следующий пример. Допустим, проект находится под контролем Git (ты ведь регулярно используешь Git, правда ведь?) и ты хочешь открыть все файлы, которые были изменены:

Одна из самых важных утилит — grep. Она настолько важна, что даже породила в профессиональном арго глагол «грепать». Grep проводит поиск по регулярному выражению, а нюансы ее использования заключаются в том, где она ищет и как выводит результат. По умолчанию grep ищет совпадения с регулярным выражением в строках, которые читает из стандартного входа, но нам это не очень-то интересно. Гораздо полезнее способность grep рекурсивно обходить содержимое каталога, находя совпадения в файлах. Вот, например:

Нет, это не дежавю, кое-что похожее мы видели раньше, только тогда grep вызывался из командной строки Vim, а сейчас мы делаем то же самое средствами командной оболочки. Пожалуй, более удобный вариант для получения списка файлов выглядит немного иначе:

Кое-кто предпочитает вместо списка файлов сразу же видеть фрагменты кода:

Ну и чуть-чуть о сетевых приложениях. Вот еще один реальный случай из практики. Имеется небольшая программка, которая отсылает POST-запрос на HTTP-сервер. Как можно посмотреть отправляемые запросы и вообще отладить взаимодействие с сервером «на коленке»? Восторженный школяр предложит поднять lighttpd с самописным CGI-скриптом или замутить сервер на Python Tornado. Начитавшийся Бека и Мартина пурист будет горой стоять за стенд с моками. Программист-минималист сделает все гораздо проще, в одну строчку в консоли:

Внимательный читатель снова может заметить, что мы тут занимаемся явным шулерством: отправка запроса и ответа никак не синхронизированы, и наш «однострочник» посылает ответ в тот момент, когда запрос еще полностью не прочитан. Да, это так! Конечно, скрипт можно еще доработать, но стоит ли оно того? У каждого инструмента свое предназначение. Описанная техника проста, незатейлива и применима в самых простых случаях. А nginx «своими руками, за пять минут, из г… и палок, без регистрации и SMS» никто и не обещал.

Как видишь, конвейер и подстановка команды — это, пожалуй, самые частые приемы в практике программиста-консольщика. Подстановка процесса… Помнится, как-то один раз она меня и в самом деле выручила, но подробности уже, увы, стерлись из памяти.

Что же до присвоения переменной, то лично мне оно чаще всего требовалось, чтобы отлаживать на встраиваемых платформах подпиленные руками суровых русских кулхацкеров системные библиотеки. Например, нам нужно отладить доработанную библиотеку libc на устройстве с файловой системой «только для чтения». Пересобирать и перезаливать прошивку? Еще чего! При помощи adb/netcat/tftp/как-нибудь-еще заливаем libc.so в каталог /tmp, к которому примонтирована tmpfs. Ну и делаем вот так:

Loving make — making love

Все кодеры делятся на три категории: те, кто ничего не знает о make, те, кто пишет make-файлы, и те, кто уже не пишет make-файлы. Принадлежащие к двум последним категориям могут смело пропустить парочку абзацев.

make — утилита, которая выполняет сборку приложения, — лежит в основе процесса сборки большинства открытых (и, наверное, кое-каких закрытых) проектов. Включая, например, AOSP или Buildroot. Да, прошивка твоего телефона и твоего роутера собраны при ее непосредственном участии (если ты, конечно, не член секты джобстеров).

В принципе, имя цели может быть произвольным, но исторически сложился набор правил именования: например, цель, выполняющая действия по умолчанию, обычно называется all, цель, выполняющая установку, — install, цель, выполняющая очистку рабочего каталога от артефактов сборки, — clean.

Только что узнавший о make обычно кидается писать собственные make-файлы под любые свои нужды. И… быстро бросает: синтаксис make неудобоварим (чего стоит хотя бы требование использовать строго Tab’ы для выделения тела рецепта), да и не все задачи на свете укладываются в схему цели — зависимости — рецепт. Большую часть make-файлов сейчас пишут не люди, а кодогенераторы: qmake, cmake, autotools. Они умеют обращаться с разными платформами, версиями компиляторов. А make-файлы — воспринимай их как низкоуровневый язык вроде ассемблера: уметь разбираться в нем весьма полезно, но делать это приходится лишь изредка. Чаще же всего программист-консольщик просто запускает сборку, а make «просто работает».

Впрочем, при компиляции программ на C++ (ну и иногда на C) порой не спасает даже это: компилятор, споткнувшись на одной ошибке, вываливает на программиста целый пучок сообщений о самых разнообразных непонятках (как-то читал у Майерса, как одна опечатка вызвала у компилятора 200-строчный «крик о помощи»), а релевантно из сообщений только первое, ну а остальные… Самое приличное, что про них можно сказать, — так это то, что их следует просто проигнорировать. Помогут в этом конвейер и утилита head:

Здесь мы перенаправляем стандартный поток ошибок в стандартный выход, а сам стандартный выход — в /dev/null. Утилита head читает со своего стандартного входа и перенаправляет на свой стандартный выход небольшое (по умолчанию — десять) число строк, отбрасывая все последующие.

Ну и о целях. В качестве аргумента make принимает имена целей, которые требуется собрать (если никаких аргументов не задано, то в качестве цели берется первая цель, встретившаяся в make-файле, обычно она имеет имя all). Цели выполняются в том порядке, в каком они заданы в аргументах make. Например, make clean all означает сначала выполнить clean, а потом all (а никак не «очистить все», как иногда почему-то считают).

Кастомные команды — зло

Кастомные команды — классная штука. Можно сделать набор повторяющихся действий, чтобы выполнять цугом. Скрипты для пересборки проекта с разными параметрами, для разворачивания на рабочей системе в разных вариантах, для push’а исходников в репозиторий, «горячей» подмены библиотек и исполняемых файлов на отладочной платформе. Или нет?

В общем, «используй то, что под рукою, и не ищи себе другое» (c). Изучай команды Linux, которые работают на большинстве систем. Пользуйся возможностями, которые предоставляет командная оболочка: автодополнением по Tab’у, поиском по истории команд, вставкой параметров предыдущих команд. Учись слепой печати, в XXI веке этот навык по степени важности стоит в одном ряду с умениями считать и читать.

Конечно, иногда кастомные команды нужны. И тогда имеет смысл сделать их частью проекта, хорошо задокументировать и положить под контроль версий. И число их должно быть минимальным.

Посмотри, как поступили разработчики AOSP с кастомными командами mmm, mma и прочими. В Qt для сборки нужны всего три кастомные команды — qmake, lupdate, lrealease. И всё. Qmake генерирует makefile, и дальнейшая сборка производится при помощи make.

«И запомни, Люк» (c): хороший программист большую часть времени читает, а не пишет. Лихорадочно повторяющийся ввод одних и тех же команд — первый признак того, что что-то пошло не так. Снова.

Заключение

Как мы увидели, программирование в консоли не требует сверхспособностей и доступно для понимания любому разработчику. При этом вместо громоздкого станка-IDE, предназначенного для решения задач, предусмотренных ее автором, способом, предусмотренным ее автором, ты используешь маленький, но гибкий набор инструментов, которые можешь комбинировать в самых разных сочетаниях.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *