[TOC] ---------------------------------------------------------------------------------------------------- # Интерфейс **Интерфейс** --- средство взаимодействия пользователя с программой. Более подробно см. [здесь](#interface). В данном разделе будет рассмотрен только интерфейс командной строки. ---------------------------------------------------------------------------------------------------- # Командная строка

**Командная строка** или **консоль** или **терминал**, является средством, позволяющим использовать *интерфейс командной строки*. Здесь происходит ввод команд и данных, а также вывод данных программами. Для открытия консоли необходимо нажать `Win`+`R`, откроется окно, показанное на картинке, набрать имя команды `cmd` и нажать `Enter`. Откроется окно следующего вида:

````shell C:\Users\user1> ```` Перед каждой командой будет стоять знак `>`(в Linux и Mac OS --- `$`). То, что написано до знака `$` или `>`, плюс сам знак, всё вместе называется *приглашением* командной строки. Как правило, оно включает адрес *текущего каталога* (будет рассмотрено далее). В консоли вводятся команды или вызываются программы, которые могут выводить сообщения и другую информацию в эту же консоль. Также программы могут запрашивать пользовательский ввод в консоли. Помимо этого программы могут выполнять другие действия, например, чтение файлов и запись в файлы, а также открывать графические окна. ---------------------------------------------------------------------------------------------------- # Структура файловой системы Большинство программ и команд, выполняемых в командной строке, предназначены для работы с *файлами* и *каталогами*, поэтому следует более подробно рассмотреть что это такое. Устройства хранения данных (флешки, жесткие диски и др.)сохраняют данные используя особенности физического процесса воздействия (намагничивание и т.д.). Контроллеры этих устройств предоставляет низкоуровневый доступ к данным, например используя физическую адресацию. Конечному пользователю с таким представлением данных работать не удобно. Поэтому были разработаны специальные программы, которые трансформируют это представление в более удобный и унифицированный (единообразный) вид. ![](tree.png) На схеме представлено пользовательское представление данных, хранящихся на устройстве хранения. Элементы данного представления: - **логический диск**, который обозначается буквами с двоеточиями: `С:`, `D:`. Одно физическое устройство может быть логически разбито на части. - **файлы** (*англ.* file) — именованная область на носителе данных, используемая как базовый объект взаимодействия с данными в операционных системах. - **папки** или **директории** или **каталоги**, это средство логической группировки файлов. Папки могут "содержать" файлы и другие папки, таким образом формируется "древовидная" (иерархическая) структура. Логический диск представляется корневым элементом древовидной структуры и называется **корневым каталогом**. Для указания файла в этой структуре используется **путь** к файлу, который предоставляет перечисление всех узлов (каталогов) дерева от корневого каталога до данного файла, включая данный файл. Узлы перечисляют через `\`(в ОC Linux и Mac --- через `/`), например: ```` С:\folder1\folder2\folder3\file2.txt ```` где `С:\` --- это корневой каталог диска. Данный путь является *абсолютным*, потому что начинается с корневого каталога. **Текущий каталог** --- это каталог, который выбран в качестве текущего в рамках текущего контекста выполнения программы (например, *окна терминала*). Пути относительно текущего каталога называются *относительным*. Например, при текущем каталоге `С:\folder1`, *относительный* путь к представленному выше файлу будет `folder2\folder3\file2.txt`. Помимо текущего каталога в рамках текущего контекста также определен **текущий диск**. Смена текущего каталога и текущего диска будет рассмотрена ниже. ---------------------------------------------------------------------------------------------------- # Структура команды Для выполнения команды в консоли вводят: - имя команды или исполнимого файла (в ОС Windows расширения `.bat` и `.exe` можно не вводить); - один или несколько аргументов, разделенных пробелами (только в том случае, если аргументы предусмотрены программой и их действительно требуется задавать). !!! note Передавать аргументы программе можно даже в том случае, если программа никаких аргументов не принимает. Переданные аргументы скорее всего будут проигнорированы. ````shell >mkdir test_dir >cd test_dir >mkdir "test dir" >dir . . . 01.03.2023 22:04 . 01.03.2023 22:04 .. 01.03.2023 22:04 test dir . . . ```` Первый пример показывает выполнение команды `mkdir` с аргументом `test_dir`. Второй пример аналогичен, только используется команда `cd`. В третьем примере строка аргумента содержит пробел, поэтому требуется заключить эту строку с пробелом в кавычки (кавычки частью строки аргумента не являются), иначе это будет воспринято как два аргумента. В четвертом примере выполняется команда `dir` без аргументов. Эта команда, в отличии от предыдущих команд, выводит какую-то информацию в консоль. В приведенных примерах демонстрируется только процесс выполнения команд. Выполняемые при этом действия нас сейчас не интересуют. ---------------------------------------------------------------------------------------------------- # Основные команды Windows Все команды Windows можно разделить на две большие группы: - Команды командного процессора, т.е. стандартного исполнителя команд работающего в терминале. - Внешние исполнимые файлы (с расширением `bat`, `exe` и некоторыми другими), эти файлы могут быть частью ОС Windows, либо установлены отдельно. ## Получение справки Многие стандартные команды и программы ОС Windows имеют аргумент `/?`, например: ````shell >cd /? Displays the name of or changes the current directory. CHDIR [/D] [drive:][path] CHDIR [..] CD [/D] [drive:][path] CD [..] .. Specifies that you want to change to the parent directory. . . . ```` Данная команда вывела справочную информацию о команде `cd`. В первой строке дается краткое описание выполняемых командой действий. Далее перечислены варианты использования (аргументы). ## Смена текущего диска Для смены текущего диска следует ввести имя этого диска с двоеточием: ````shell C:\Users1>E: E:\> ```` Как показывает *подсказка* командной строки, до выполнения команды `E:` текущим диском был `C:`. ## `cd` --- смена текущего каталога `cd` означает "change directory" (сменить каталог). ````shell C:\Users1\test_dir>cd "test dir" C:\Users1\test_dir\test dir> ```` В данном примере мы выполнили переход в подкаталог текущего каталога используя *относительный путь*. Также были использованы кавычки, потому что имя указанный путь содержит пробел. Для перехода на уровень выше (в надкаталог) используется путь `..`. ````shell C:\Users1\test_dir\test dir>cd .. C:\Users1\test_dir> ```` Полезным параметром является ключ `/d`, который позволяет сменить не только каталог, но и диск. ````shell C:\Users1\test_dir>cd /d E:\python E:\python> ```` Команда `cd` без аргументов печатает путь к текущему каталогу. ````shell E:\python>cd E:\python E:\python> ```` ## `dir` --- просмотр содержимого каталога ````shell C:\Users1\test_dir>dir Volume in drive C has no label. Volume Serial Number is EDC2-A21E Directory of C:\Users1\test_dir 01.03.2023 23:30 . 01.03.2023 23:30 .. 01.03.2023 23:36 69 cd.bat 01.03.2023 22:04 test dir 1 File(s) 69 bytes 3 Dir(s) 79 989 538 816 bytes free ```` Данный пример показывает что в текущем каталоге находится подкаталог `test_dir` (помечен как ``), а также файл `cd.bat` размером 69 байт. Важно отметить что команда `dir` показывает также *псевдокаталоги*: - `.` --- это указатель на текущий каталог; - `..` --- это указатель на родительский каталог. Полезным аргументом является `/b`, который выводит список каталогов без дополнительной информации. ````shell C:\Users1\test_dir>dir /b cd.bat test dir ```` ---------------------------------------------------------------------------------------------------- # Переменные окружения **Переменные окружения** (*англ.* environment variables) --- это переменные, установленные в операционной системе (ОС) и доступные всем программам. Значениями этих переменных могут быть только строки. Пример: ````shell >set CAT_NAME=Федор >echo кот %CAT_NAME% кот Федор ```` Команда командной строки `set` устанавливает переменную окружения с именем `CAT_NAME` и значением `Федор`. Интерпретатор командной строки распознает указания переменных (в ОС Windows они заключаются в символы `%`) и заменяет их на соответствующие значения. !!! note В ОС Windows имена переменных окружения являются регистронезависимыми , т.е. команда `echo кот %cat_name%` будет иметь такой же результат. В ОС Linux переменные окружения регистрозависимы, т.е. `CAT_NAME` и `cat_name` это разные переменные. Формат указания переменных такой: `$CAT_NAME` или `${CAT_NAME}`. В большинстве случаев принято задавать имена переменных окружения полностью в верхнем регистре. ---------------------------------------------------------------------------------------------------- # Порядок поиска исполнимых файлов Если в консоли ввести имя исполнимого файла (`*.exe`, `*.bat` и некоторые другие) и нажать клавишу `Enter`, то данный файл будет запущен на исполнение. Однако возникает вопрос: какой именно файл с указанным именем будет запущен? Ведь файлы с одинаковыми именами могут существовать в различных каталогах. Здесь действует следующие правила: - сначала указанный файл ищется в текущем каталоге, если файл найден, то он исполняется (в OC Linux и MacOS это правило не действует); - если файл не найден, то поиск ведется последовательно в каталогах, перечисленных в переменной `PATH`; - если файл не найден, то выдается ошибка: ````shell >unknown.bat "unknown.bat" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. ```` Значение переменной `PATH` является списком путей каталогов, разделенных символом `;` (в OC Linux и MacOS разделителем является `:`). !!! note В Windows 10 и 11 графический диалог редактирования переменной `PATH` представляет пути в виде списка. Это сделано для удобства пользователя, на самом деле значение хранится как одна строка разделенная символом `;`. ---------------------------------------------------------------------------------------------------- # Перенаправление ввода/вывода Различные языки программирования как правило имеют те или иные команды "печати". Например в языке Python это команда `print()`. Эти команды печати на самом деле выводят текст в так называемый *стандартный поток вывода*. По умолчанию этот поток направлен в консоль, однако он может быть перенаправлен: - в файл; - на вход другой программы. Рассмотрим пример: ````shell >cd C:\Users1\test_dir >cd > current_dir.txt >type current_dir.txt C:\Users1\test_dir ```` Как мы видим команда `cd` по умолчанию выводит данные в консоль. Директива перенаправления вывода `>` предписывает записать эти данные в фай (если такой файл уже существует, то он будет перезаписан). Команда `type` просто выводит содержимое файла в консоль. Директива `>>` позволяет дописать существующий файл. ````shell >echo la-la-la >> current_dir.txt >type current_dir.txt C:\Users1\test_dir la-la-la ```` Здесь команда `echo` печатает заданный текст в стандартный поток вывода, который перенаправляется в файл с дописыванием. Если `>>` заменить на `>`, то файл перезапишется: ````shell >echo la-la-la > current_dir.txt >type current_dir.txt la-la-la ```` Команда `input()` в языке Python реализует *стандартный ввод* программы, который по умолчанию осуществляется из консоли (клавиатуры), но может быть выводом другой программы. Например: ````shell >dir /b cd.bat current_dir.txt test dir >dir /b | find "_" current_dir.txt ```` Команда `dir` и данном случае выводит три элемента каталога. Команда `find` может принимать через стандартный вход набор строк и выводить только те из них, в которых имеется указанная подстрока, в данном случае "_". Перенаправление стандартного ввода из файла задается директивой `<`: ````shell >find "a" < current_dir.txt la-la-la >find "o" < current_dir.txt > ```` С помощью перенаправления потока ввода/вывода можно собирать цепочки команд: ````shell >dir /b | find "_" > list.txt >type list.txt current_dir.txt ```` Здесь команда `dir` передает свой вывод команде `find`, которая вместо вывода в консоль записывает результаты своей работы в файл. В ОС Linux и MacOS аналогичная команда называется `ls`. ---------------------------------------------------------------------------------------------------- # Генерация входных данных Программа может принимать многострочные входные данные из стандартного потока ввода (с клавиатуры или из файла). Например может быть такая программа на языке Python: ````code while True: i = int(input()) if i < 10: continue elif i > 100: break print(i) ```` При небольшом количестве данных запуск такой программы может выполняться следующим образом: ````shell >(echo 9 & echo 30 & echo 20 & echo 101) | python process_input.py 30 20 ```` Также протестируем данный метод с использованием встроенной команды `find`: ````shell >(echo a & echo b) | find "b" b ````