Содержание статьи
GUI и CLI
С точки зрения обычного пользователя, ОС — это графическая оболочка для манипуляций с файловой системой компьютера и запуска различных приложений. Внешне операционные системы отличаются друг от друга незначительно, так как графический интерфейс везде состоит из одних и тех же элементов (окна, кнопки, раскрывающиеся списки и прочее), а файловые системы построены на одном принципе вложенных каталогов и файлов.
Поэтому работа с GUI-приложениями в Windows и Linux выглядит одинаково и интуитивно понятна, основные операции выполняются стандартными способами в более‑менее привычном интерфейсе.
Продвинутые пользователи и профессионалы для автоматизации работы пользуются еще одним инструментом, присутствующим в любой десктопной операционной системе. Это командный интерпретатор (оболочка) и набор стандартных утилит, исполняющихся в консольном режиме. Командный интерпретатор решает сразу две задачи:
- выполнение команд, которые вводятся вручную с помощью интерфейса командной строки (Command Line Interface, CLI);
- поддержка языка программирования для создания скриптов, исполняемых в операционной системе.
В отличие от графического интерфейса, CLI-инструменты нельзя назвать интуитивными. Нужно знать, какие именно команды есть в операционной системе, с какими ключами их запускать, как можно комбинировать эти команды для получения требуемого результата.
Дело осложняется тем, что в Windows и Linux используются разные командные оболочки со своими наборами служебных команд. Это связано как с принципиальными отличиями в архитектуре ОС, так и с историческими причинами.
CLI в Linux
В Linux работу с командной строкой поддерживает та или иная модификация оригинальной оболочки sh операционной системы Unix, обычно это Bash (Bourne again shell) или Zsh (Z shell).

Функциональность этих командных интерпретаторов и набор консольных утилит базируются на стандарте POSIX, созданном для обеспечения совместимости различных Unix-подобных операционных систем. Поэтому во всех модификациях Linux (как и в операционной системе macOS) используются одни и те же команды, которые можно соединять друг с другом в программные конвейеры, когда текст из выходного потока одной утилиты направляется на вход другой.
Многие стандартные команды Linux ориентированы на обработку текста (grep
, sed
, awk
, sort
, cut
, tail
), так как в Unix-подобных операционных системах текстовые данные принято использовать в качестве универсального представления информации, различные системные настройки и конфигурации приложений хранятся в обычных текстовых файлах.
Еще один базовый принцип Unix, перешедший в Linux, выражается фразой «всё есть файл». Поэтому одни и те же утилиты можно использовать для работы как с обычными текстовыми файлами, так и с виртуальными файлами, представляющими собой каналы связи программ друг с другом, периферийными устройствами и устройствами, эмулирующими ядро операционной системы.
Таким образом, несложные задачи автоматизации в Linux в итоге сводятся к манипуляциям с файловой системой и обработке текста с помощью имеющихся в системе стандартных команд. Такие задачи удобно решать, последовательно применяя несколько команд, объединенных текстовыми потоками в конвейер.

Типичный пример: необходимо очистить каталог /
от файлов, которые старше семи дней. Объединяем в конвейер команду find
для поиска файлов и команду rm
для их удаления:
find /tmp -type f -name '*' -mtime +7 -print0 | xargs -0 rm -f
В более сложных случаях, когда парой конвейеров не обойтись, пишут сценарии на поддерживаемом оболочкой древнем командно‑скриптовом языке, который никак нельзя назвать удобным и интуитивно понятным, или на одном из универсальных интерпретируемых языков, самый популярный из которых сейчас — Python.
CLI в Windows
Современные версии Windows базируются на разработанной в начале 1990-х годов Windows NT, имеющей, в отличие от Unix, API-ориентированную архитектуру. Операционные системы этого семейства состоят из огромного числа подсистем и компонентов, доступ к которым организован через специфические API. Для упрощения работы с такой сложной системой управляемые элементы группируются в структурированные объекты.
В этом и состоит принципиальное отличие Windows от Unix-подобных систем, которые ориентированы на использование текста для представления всего, что только можно. Инструмент для управления Windows из командной строки должен не только поддерживать работу с файловой системой и текстовыми файлами, как в Unix-системах, но и обеспечивать простой и единообразный доступ к свойствам и методам множества внутренних объектных моделей Windows (.NET Framework, WMI, WSH, ADSI, CDO и так далее).
Стандартный командный интерпретатор cmd.
, появившийся в Windows NT и благополучно доживший до последних версий Windows, не имел такой возможности, его основной задачей было обеспечивать обратную совместимость с командным интерпретатором command.
предыдущей операционной системы MS-DOS, в которой не было никаких внутренних объектных систем. По возможностям оболочки cmd.
и составу системных консольных утилит Windows всегда уступала Unix-подобным системам. Основные усилия разработчиков направлялись на улучшение графической оболочки, а не на командную строку.
Для решения этих проблем Microsoft в начале 2000-х разработала новую оболочку и среду выполнения сценариев Windows PowerShell, которая впитала в себя удачные решения из других оболочек и скриптовых языков. PowerShell обеспечивает прямой доступ из командной строки к внутренним объектам системы и позволяет работать с различными источниками данных (например, с системным реестром или хранилищем сертификатов) по принципу файловой системы. Внутренний набор команд PowerShell можно дополнять собственными командами, которые полностью интегрируются в оболочку.
От всех других оболочек командной строки PowerShell отличает главная особенность — ее ориентация на объекты. Команды PowerShell, которые принято называть командлетами, взаимодействуют друг с другом не с помощью символьных строк, а через объекты. Поэтому работать в PowerShell становится проще, чем в традиционных оболочках: не нужно дополнительно ничего делать, чтобы выделить информацию из символьного потока.

Например, нужно получить упорядоченный по количеству затраченного процессорного времени список процессов, идентификаторы которых больше 1000. Это делается конвейером из трех команд, назначение которых очевидно из их названий:
Get-Process | Where-Object Id -gt 1000 | Sort-Object cpu -Descending
Для поддержки объектов разработчики PowerShell воспользовались объектной моделью .NET Framework. Таким образом, язык PowerShell относится к .NET-языкам программирования (как C#), и при этом он совершенно не похож на другие. Это командно‑скриптовый язык, позволяющий совмещать в сценариях императивный и декларативный стили программирования.
Объединение миров Windows и Linux
Итак, в Windows и Linux живут совершенно разные командные оболочки, однако стараниями Microsoft стало возможным работать с привычной для себя оболочкой в любой системе:
- Bash в Windows. С помощью подсистемы WSL (Windows Subsystem for Linux) можно установить из Microsoft Store один из дистрибутивов Linux и пользоваться его командной оболочкой для работы с файловой системой Windows или запуска Windows-утилит. Также в этом случае можно будет запускать утилиты Linux в командной строке Windows.
- PowerShell в Linux. В 2017 году Microsoft открыла исходный код PowerShell, теперь это Open Source проект (вот репозиторий на GitHub). Оболочка, использующая .NET Core, стала кросс‑платформенной, с ней можно работать в различных дистрибутивах Linux (Debian, Ubuntu, CentOS, Red Hat, openSUSE, Fedora) и в macOS.
Вначале кросс‑платформенная версия оболочки называлась PowerShell Core 6, чтобы явно указать ее зависимость от .NET Core. Начиная с седьмой версии слово Core из названия убрали, теперь оболочка носит имя просто PowerShell. Версия оболочки, базирующаяся на полной платформе Windows .NET Framework, называется Windows PowerShell.
Установка и запуск
Установка PowerShell зависит от типа операционной системы и ее версии, соответствующие инструкции имеются на сайте Microsoft. Например, для установки PowerShell в операционной системе Linux Ubuntu 20.04 нужно выполнить следующие команды:
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo add-apt-repository universe
sudo apt-get install -y powershell
Чтобы запустить установленную оболочку PowerShell, выполним в терминале команду pwsh
. После вывода информации о версии PowerShell мы получим обычное приглашение командной строки с путем к текущему каталогу в качестве префикса.

PowerShell как командная оболочка
Для эффективной и удобной работы в командной строке важны два момента.
- Нужно знать названия команд и их ключей. Запомнить их будет проще, если синтаксис команд интуитивно понятен и однороден. Если мы не помним ключи у команды, то должна быть возможность быстро найти справку по этой команде и примеры ее использования.
- Сами команды и их ключи должны быть краткими и удобными для быстрого набора на клавиатуре. Оболочка должна поддерживать механизмы автодополнения, поиска и повтора выполнявшихся ранее команд.
Если со вторым пунктом у стандартных оболочек Linux все хорошо, то похвалиться понятностью имен и ключей команд они не могут: названия многих утилит представляют собой аббревиатуры, придуманные еще в 1960-е годы, а одни и те же ключи в разных командах могут иметь разный смысл. В PowerShell такой проблемы нет.
Структура команд и псевдонимы
В PowerShell имена всех внутренних команд соответствуют шаблону «действие‑объект», например Get-Process
(получить информацию о процессе), Get-Content
(получить содержимое файла), Clear-Host
(очистить экран). Для одинаковых параметров команд используются стандартные имена, структура параметров во всех командах идентична, все команды обрабатываются одним синтаксическим анализатором. Это делает семантику команд очевидной и значительно упрощает запоминание и использование команд PowerShell.
С другой стороны, иногда PowerShell ругают именно за этот многословный и необычный для других оболочек синтаксис. Например, нам нужно создать в текущем каталоге пустой файл 1.
. В Bash это делается командой touch
из пяти букв:
~ touch 1.txt
При создании файла в PowerShell с помощью команды New-Item
с параметрами потребуется ввести больше двадцати символов.

Выглядит ужасно, правда? Но того же результата можно добиться, набрав команду ni
всего из двух символов.

Команда ni
— это стандартный псевдоним для New-Item
(сокращение по первым буквам слов команды), значение File
для параметра -Type
используется по умолчанию, имя параметра -Path
можно опустить.
Таким образом, стандартные псевдонимы PowerShell, полный список которых можно получить с помощью команды Get-Alias
, помогают быстро вводить команды и создавать компактные и лаконичные конвейеры из нескольких команд.

Отметим, что в Windows PowerShell за некоторыми командлетами закреплены псевдонимы, соответствующие стандартным командам Unix-подобных систем: ls
, rm
, cp
, mv
, cat
, ps
, man
, mount
. В PowerShell 6/7 данные псевдонимы не определены, их ввод приведет к выполнению «родных» команд Linux.
Доступность команд
В .NET Core/.NET 5 реализована не вся функциональность платформы .NET Framework, поэтому в PowerShell 6/7 по умолчанию загружается меньше модулей и будет доступно меньше команд, чем в Windows PowerShell. Например, под Linux недоступны команды *-Service,
.
Часть из отсутствующих модулей напрямую связаны с особенностями операционной системы Windows и не могут быть перенесены на другие платформы (так, в PowerShell для Linux отсутствуют провайдеры и виртуальные диски для системного реестра и хранилища сертификатов), некоторые модули могут быть добавлены в следующих версиях PowerShell.
При работе с PowerShell в Linux необходимо учитывать особенности операционной системы.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»