From 7795c97e655f38852eed2dfe49eeb32805ab48b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9A=D0=BE?= =?UTF-8?q?=D0=B7=D0=BB=D1=8E=D0=BA?= Date: Wed, 28 Feb 2024 12:55:16 +0300 Subject: [PATCH] =?UTF-8?q?lab01:=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=20=D1=81=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=BE=D0=B9=20Unix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- labs/lab01/README.md | 138 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 112 insertions(+), 26 deletions(-) diff --git a/labs/lab01/README.md b/labs/lab01/README.md index bf14753..db799f7 100644 --- a/labs/lab01/README.md +++ b/labs/lab01/README.md @@ -370,21 +370,53 @@ for (double x : numbers) { Дальнейшая работа ведется в консоли из каталога с файлом `*.exe`, в CodeBlocks это может быть `bin\Debug`. +#### Командная строка Windows + +Командная строка (терминал) запускается через *Win+R*, `cmd` или путем ввода +`cmd` в строку адреса в «Проводнике» и нажатия *Enter.* + +Текст `C:\>` слева от курсора называется *приглашением (prompt).* +Приглашение показывает текущий каталог — корень диска C. +Перейти в другой каталог можно командой `cd`, например, `cd lab01`. +Если нужно перейти на другой диск, добавляется *ключ (опция)* `/d`, +например: `cd /d L:\A-01-18\username`. +Чтобы не вводить путь вручную, +можно нажимать *Tab* после ввода первых символов имени каталога, +и Windows дополнит путь. +Если нужно повторить одну из предыдущих команд, +стрелки вверх и вниз проматывают историю. + +Если нужно отредактировать команду, +стрелками можно перемещать курсор влево-вправо. +Скопировать и вставить текст в Windows 10 и выше можно `Ctrl+C`/`Ctrl+V`, +а в более старых системах нужно вызвать контекстное меню заголовка окна +и выбрать там *Изменить... → Копировать.* + При затруднениях в работе с консолью можно воспользоваться [руководством][cmd]. [cmd]: http://cmd.readthedocs.io/cmd.html -#### Командная строка Windows +#### Командная строка Unix (Linux, OS X) -Командная строка (терминал) запускается через *Win+R*, `cmd` или путем ввода -`cmd` в строку адреса в «Проводнике» и нажатия *Enter.* Текст `C:\>` слева -от курсора называется *приглашением (prompt).* Приглашение показывает -текущий каталог — корень диска C. Перейти в другой каталог можно -командой `cd`, например, `cd lab01`. Если нужно перейти на другой диск, -добавляется *ключ (опция)* `/d`, например: `cd /d L:\A-01-18\username`. -Чтобы не вводить путь вручную, можно нажимать *Tab* после ввода первых -символов имени каталога, и Windows дополнит путь. Если нужно повторить -одну из предыдущих команд, стрелки вверх и вниз проматывают историю. +Терминал обычно запускается через лаунчер поиском по слову `Terminal`. +Конкретная программа зависит от операционной системы и дистрибутива Linux. +Подойдет любая. + +Текст вида `<имя пользователя>@<имя машины>:~$` слева от курсора +называется *приглашением (prompt).* +Приглашение показывает текущий каталог — домашнюю директорию `~`, +что является сокращением для `/home/<имя пользователя>`. +Перейти в другой каталог можно командой `cd`, например, `cd lab01`. +Чтобы не вводить путь вручную, +можно нажимать *Tab* после ввода первых символов имени каталога, +и Windows дополнит путь. +Если нужно повторить одну из предыдущих команд, +стрелки вверх и вниз проматывают историю. + +Если нужно отредактировать команду, +стрелками можно перемещать курсор влево-вправо. +Скопировать и вставить текст можно сочетаниями `Ctrl+Shitf+C`/`Ctrl+Shift+V` +или `Ctrl+Ins`/`Shift+Ins` (для OS X вместо `Ctrl` используется `Cmd`). #### Запуск программ без CodeBlocks @@ -394,6 +426,12 @@ for (double x : numbers) { C:\lab01\bin\Debug> lab01 ``` +В Unix у исполняемых файлов нет расширения `*.exe` и запуск делается иначе: + +```sh +user@host:~/lab01/bin/Debug$ ./lab01 +``` + Однако это может привести к сообщению об ошибке (имя библиотеки может быть иным): @@ -427,15 +465,21 @@ target_link_options(xxx PRIVATE -static -static-libstdc++) вывода (standard output, stdout).* По умолчанию стандартный ввод связан с клавиатурой, а вывод — с терминалом (окном консоли в Windows). Однако можно при запуске программы указать, что стандартным вводом для нее будет -не клавиатура, а файл *(перенаправление ввода, input redirection):* +не клавиатура, а файл *(перенаправление ввода, input redirection).* -``` shell -C:\lab01> lab01.exe < 01-example.input.txt +Windows: +```cmd +C:\lab01\bin\Debug> lab01.exe < 01-example.input.txt Enter number count: Enter numbers: Enter bin count: 2|** 5|***** 3|*** ``` +Unix: +```sh +user@host:~/lb01/bin/Debug$ ./lab01 < 01-example.input.txt +``` + **Внимание.** Здесь и далее примеры работы с командной строкой включают приглашение `C:\lab01>`, команду и ее вывод. Приглашение вводить не нужно, это просто @@ -451,10 +495,16 @@ Enter number count: Enter numbers: Enter bin count: 2|** Видно, что гистограмма строится правильно, но картину портят приглашения ввода (`Enter number count` и прочие). -Аналогично можно направить стандартный вывод в файл: +Аналогично можно направить стандартный вывод в файл. + +Windows: +```cmd +C:\lab01\bin\Debug> lab01.exe < 01-example.input.txt > 01-example.actual.txt +``` -``` shell -C:\lab01> lab01.exe < 01-example.input.txt > 01-example.actual.txt +Unix: +```sh +user@host:~/lab01/bin/Debug$ ./lab01 < 01-example.input.txt > 01-example.actual.txt ``` Вывода на терминал нет — он весь в `01-example.actual.txt`, и если его @@ -482,28 +532,37 @@ cerr << "Enter number count: "; связан с терминалом. Если же перенаправить вывод в файл, записанное в `cerr` появится в терминале, но не в файле `01-example.actual.txt`: -``` shell -C:\lab01> lab01.exe < 01-example.input.txt > 01-example.actual.txt +``` cmd +C:\lab01\bin\Debug> lab01.exe < 01-example.input.txt > 01-example.actual.txt Enter number count: Enter numbers: Enter bin count: ``` Чтобы убрать декоративный вывод при автоматических тестах, можно направить -его в специальное устройство `NUL`, которое поглощает любой вывод в него: +его в специальное устройство `NUL`, которое поглощает любой вывод в него. -``` shell -C:\lab01> lab01.exe < 01-example.input.txt > 01-example.actual.txt 2>NUL +**Внимание.** +Здесь между Windows и Unix есть отличие: `2>NUL` vs `2>/dev/null`. + +Windows: +```cmd +C:\lab01\bin\Debug> lab01.exe < 01-example.input.txt > 01-example.actual.txt 2>NUL +``` + +Unix: +```cmd +user@host:~/lab01/bin/Debug> ./lab01 <01-example.input.txt >01-example.actual.txt 2>/dev/null ``` Вывода в терминал при этом нет никакого, хотя программа успешно работает. -#### Сравнение файлов  +#### Сравнение файлов (Windows) Программа `fc` (file compare) позволяет построчно сравнить файл вывода  программы `01-example.actual.txt` с файлом `01-example.expected.txt`, содержащим эталонный вывод: -``` shell -C:\lab01> fc 01-example.actual.txt 01-example.expected.txt +``` cmd +C:\lab01\bin\Debug> fc 01-example.actual.txt 01-example.expected.txt Сравнение файлов 01-example.actual.txt и 01-EXAMPLE.EXPECTED.TXT FC: различия не найдены ``` @@ -513,8 +572,8 @@ FC: различия не найдены [fc]: http://ab57.ru/cmdlist/fc.html -``` shell -C:\lab01> fc /N 01-example.actual.txt 02-alignment.expected.txt +``` cmd +C:\lab01\bin\Debug> fc /N 01-example.actual.txt 02-alignment.expected.txt Сравнение файлов 01-example.actual.txt и 02-ALIGNMENT.EXPECTED.TXT ***** 01-example.actual.txt 1: 2|** @@ -527,6 +586,33 @@ C:\lab01> fc /N 01-example.actual.txt 02-alignment.expected.txt ***** ``` +#### Сравнение файлов (Unix) + +Программа `diff` (difference) позволяет построчно сравнить файл вывода  +программы `01-example.actual.txt` с файлом `01-example.expected.txt`, +содержащим эталонный вывод: + +``` sh +user@host:~/lab01/bin/Debug$ diff -u 01-example.actual.txt 01-example.expected.txt +``` + +Если отличий нет, `diff` не печатает ничего, как в примере выше. + +Если бы были отличия, `diff` могла бы показать отличающиеся строки и их номера: + +``` sh +user@host:~/lab01/bin/Debug$ diff -u 01-example.actual.txt 02-alignment.expected.txt +--- 01-example.actual.txt 2023-02-06 23:52:25.513825363 +0300 ++++ 02-alignment.expected.txt 2023-02-06 23:52:25.514825395 +0300 +@@ -1,3 +1,3 @@ +- 2|** +- 5|***** +- 3|*** ++ 9|********* ++ 33|********************************* ++100|**************************************************************************************************** +``` + #### BAT-файлы Чтобы не вводить каждый раз команды вручную, их можно записать в файл