Перейти к основному содержимому

2.05. Знаки препинания в командной строке

Разработчику Архитектору Инженеру

Знаки препинания в командной строке

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

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


Оболочка, подпроцесс и контекст выполнения

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

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

Контекст выполнения — это совокупность всех доступных в данный момент ресурсов: переменных среды, открытых файловых дескрипторов, рабочей директории, ограничений на ресурсы и т.д. Знаки препинания часто управляют тем, в каком контексте будет происходить выполнение.


Круглые скобки

Скобки круглые используются для создания подпроцесса. Команды, заключённые в ( ), выполняются в новом экземпляре оболочки.

Пример:

(current_dir=$(pwd); cd /tmp; echo "Текущая директория внутри подпроцесса: $(pwd)"; cd "$current_dir")
echo "Текущая директория после подпроцесса: $(pwd)"

Внутри подпроцесса изменяется рабочая директория, но после завершения подпроцесса родительская оболочка остаётся в исходной директории. Это происходит потому, что cd изменяет состояние только внутри подпроцесса.

Скобки также используются для группировки команд без создания подпроцесса при использовании { }. Разница между ( ) и { } принципиальна: первые порождают новый процесс, вторые — нет.


Фигурные скобки

Фигурные скобки группируют команды в текущем контексте. Они не создают подпроцесс, а объединяют несколько команд в единый блок, который воспринимается оболочкой как одна лексема.

Пример:

{ echo "Начало"; date; echo "Конец"; }

Этот блок выполняется в текущей оболочке. Переменные, изменённые внутри { }, сохраняют свои значения после завершения блока.

Фигурные скобки также используются для расширения переменных: ${VAR} — это явное указание границ имени переменной, особенно когда за именем следует символ, не являющийся частью имени (например, цифра или буква).

Пример:

name="file"
echo "${name}1.txt" # выводит file1.txt
echo "$name1.txt" # пытается подставить переменную name1, если она не определена — выводит .txt

В PowerShell фигурные скобки применяются для блоков кода, аналогично Bash, но также используются в выражениях и строковых интерполяциях: "Hello ${env:USER}".

В CMD фигурные скобки не имеют специального смысла и воспринимаются как обычные символы, если не используются в контексте переменных (%VAR%), где они не нужны.


Управляющие символы

Эти символы определяют порядок и способ выполнения команд.

Точка с запятой ; разделяет команды в одной строке. Каждая команда выполняется последовательно, независимо от результата предыдущей.

Пример:

ls; pwd; date

Все три команды будут выполнены, даже если ls завершится с ошибкой.

Амперсанд & запускает команду в фоновом режиме. Оболочка немедленно возвращает управление, не дожидаясь завершения команды.

Пример:

firefox &

Браузер запускается, и пользователь может продолжать работать в терминале.

Если используется && или ||, то & имеет более низкий приоритет, поэтому важно использовать скобки при необходимости:

(command1 && command2) &

Пайп | соединяет стандартный вывод одной команды со стандартным вводом следующей. Это основа конвейеров (pipelines).

Пример:

ps aux | grep ssh | wc -l

Результат ps передаётся в grep, затем — в wc.

Пайп создаёт два подпроцесса, даже если команды простые. Все процессы в конвейере запускаются одновременно.

&& это логическое И. Вторая команда выполняется только если первая завершилась успешно (код возврата 0).

Пример:

mkdir mydir && cd mydir && touch file.txt

Если mkdir не удалось (например, директория уже существует), остальные команды не будут выполнены.

|| это логическое ИЛИ. Вторая команда выполняется только если первая завершилась с ошибкой (код возврата ≠ 0).

Пример:

ping -c 1 google.com || echo "Сеть недоступна"

Если пинг провалился, выводится сообщение.

В PowerShell эти операторы тоже существуют, но синтаксис немного отличается: && и || поддерживаются в PowerShell 7+, в старых версиях используются -and и -or внутри условий, а для последовательного выполнения — ; или if ($?).

В CMD используются & для последовательного выполнения, && и || не поддерживаются напрямую. Вместо них применяются IF ERRORLEVEL или IF %ERRORLEVEL% EQU 0.


Кавычки

Кавычки управляют интерпретацией содержимого. Они определяют, какие символы должны быть проинтерпретированы оболочкой, а какие — переданы «как есть».

Внутри одинарных кавычек '...' всё воспринимается буквально. Ни переменные, ни подстановки команд, ни escape-символы не обрабатываются.

Пример:

echo 'Hello $USER, today is $(date)'
# Вывод: Hello $USER, today is $(date)

Это самый надёжный способ передать строку без интерпретации.

В PowerShell одинарные кавычки работают аналогично. В CMD одинарные кавычки не имеют специального смысла и воспринимаются как часть строки.

Внутри двойных кавычек "..." обрабатываются переменные, подстановки команд и escape-символы (\n, \t, \$, \" и т.д.), но не происходит глобbing (раскрытие звёздочек и других шаблонов).

Пример:

echo "Hello $USER, today is $(date)"
# Вывод: Hello alice, today is Fri Mar 13 10:30:00 UTC 2026

Двойные кавычки позволяют встраивать динамические данные в статичный текст.

В PowerShell двойные кавычки поддерживают интерполяцию переменных и выражений: "Hello $env:USERNAME".

В CMD двойные кавычки используются для группировки аргументов, содержащих пробелы, но интерполяция переменных происходит через %VAR%, а не $VAR.

Обратные кавычки `...` обозначают подстановку команды (command substitution). Содержимое внутри выполняется как команда, и её стандартный вывод заменяет всю конструкцию.

Пример:

echo "Сейчас: `date`"
# Эквивалент: echo "Сейчас: $(date)"

Современная практика рекомендует использовать $() вместо ` из-за проблем с вложенностью и читаемостью.

В PowerShell обратные кавычки — это escape-символ (для буквального включения символа, например, `n для перевода строки), а подстановка команд выполняется через $(...).

В CMD обратные кавычки не имеют специального значения.


Символы управления потоками

Эти символы перенаправляют потоки ввода-вывода.

< перенаправляет содержимое файла на стандартный ввод команды.

Пример:

sort < numbers.txt

Команда sort читает данные из numbers.txt, как будто они были введены с клавиатуры.

> перенаправляет стандартный вывод команды в файл, перезаписывая его содержимое.

Пример:

ls > filelist.txt

Файл filelist.txt создаётся или перезаписывается, и в него записывается вывод ls.

>> добавляет стандартный вывод в конец файла, не стирая существующее содержимое.

Пример:

date >> log.txt

Текущая дата добавляется в конец log.txt.

<<. Here-document — механизм передачи многострочного текста в стандартный ввод команды. Завершается маркером, указанным после <<.

Пример:

cat << EOF
Привет,
это многострочный текст.
EOF

Все строки до EOF передаются в cat.

Маркер может быть в одинарных кавычках (<< 'EOF'), тогда интерполяция отключена, или без кавычек — тогда включена.

<<<. Here-string — передаёт одну строку в стандартный ввод. Строка указывается сразу после <<<.

Пример:

wc <<< "hello world"

Эквивалентно echo "hello world" | wc.

В PowerShell перенаправления работают частично: > и >> поддерживаются, < — нет (используется Get-Content | cmd). Here-document и here-string отсутствуют в классическом виде, но есть аналоги через @"" и ConvertTo-Json.

В CMD используются >, >>, <, но синтаксис более ограничен. Например, type file.txt > output.txt.


Символы расширения и шаблонов

Эти символы используются для сопоставления имён файлов (globbing).

* соответствует любой последовательности символов (включая пустую).

Пример:

ls *.log

Сопоставляет все файлы с расширением .log.

? соответствует одному любому символу.

Пример:

ls file?.txt

Сопоставляет file1.txt, fileA.txt, но не file10.txt.

[...] сопоставляет один символ из указанного диапазона или множества.

Пример:

ls file[0-9].txt

Сопоставляет file0.txt, file1.txt, ..., file9.txt.

Можно использовать [^a-z] для отрицания.

{...} нельзя путать с фигурными скобками для группировки! В контексте расширения {a,b,c} означает перечисление вариантов.

Пример:

touch file_{1,2,3}.txt

Создаст file_1.txt, file_2.txt, file_3.txt.

Это называется brace expansion и происходит до globbing и до интерпретации переменных.

В PowerShell brace expansion не поддерживается напрямую, но можно использовать 1..3 | ForEach-Object { "file_$_.txt" }.

В CMD нет brace expansion.


Символы переменных и подстановок

$ это основной префикс для обращения к переменной.

Пример:

name="Alice"
echo $name

В PowerShell $ тоже используется, но имя переменной пишется без кавычек и без подчёркивания: $name.

В CMD используется %VAR%, а $ — как обычный символ.

${VAR} это явное указание границ переменной. Необходимо, когда за именем переменной следует символ, который может быть воспринят как часть имени.

Пример:

count=5
echo "There are ${count} items"

Без фигурных скобок: echo "There are $countitems" — оболочка попытается найти переменную countitems.

$(). Command substitution — выполнение команды и подстановка её вывода.

Пример:

uptime=$(uptime -p)
echo "Система работает: $uptime"

Поддерживается во всех современных оболочках Unix. В PowerShell используется $(...), в CMD — нет прямого аналога (используются for /f или временные файлы).

$(( )) это арифметическое расширение в Bash/Zsh. Выполняет целочисленные вычисления.

Пример:

a=5
b=3
sum=$((a + b))
echo $sum # выводит 8

Поддерживается только в POSIX-совместимых оболочках. В PowerShell арифметика выполняется напрямую: $sum = $a + $b. В CMD используется set /a.


Символы условия и тестирования

[ ]. Команда test, записанная в квадратных скобках. Используется для проверки условий в сценариях.

Пример:

if [ -f "/etc/passwd" ]; then
echo "Файл существует"
fi

Квадратные скобки — это не синтаксический элемент оболочки, а вызов внешней команды test. Поэтому между [ и первым аргументом, а также между последним аргументом и ], должны быть пробелы.

[[ ]] это улучшенная версия [ ], встроенная в Bash/Zsh. Поддерживает дополнительные операторы: ==, =~ (регулярные выражения), ``, ||, !, а также не требует экранирования некоторых символов.

Пример:

if [[ $name =~ ^[A-Z][a-z]+$ ]]; then
echo "Имя начинается с заглавной буквы"
fi

[[ ]] не существует в POSIX shell, поэтому не следует использовать его в скриптах, предназначенных для /bin/sh.

В PowerShell условия оформляются через if ($var -eq "value"), в CMD — через IF EXIST, IF DEFINED, IF ERRORLEVEL.

case это оператор множественного выбора. Использует шаблоны, сие с globbing.

Пример:

case $1 in
start) echo "Запуск";;
stop) echo "Остановка";;
*) echo "Неизвестная команда";;
esac

Шаблоны могут содержать *, ?, [...], но не {}.


Специальные символы

# это символ комментария. Всё, что следует после # в строке, игнорируется оболочкой.

Пример:

ls -l  # показать список файлов

В PowerShell # тоже комментарий. В CMD комментарии обозначаются через REM.

\ это Escape-символ. Отменяет специальное значение следующего символа.

Пример:

echo "He said \"Hello\""
# или
echo He\ said\ \"Hello\"

В Windows CMD \ тоже escape, но используется реже, так как многие символы не имеют специального смысла.

В PowerShell \ — escape, но для некоторых символов (например, кавычек) требуется `.

!. В Bash ! используется для отрицания в условиях (! -f file) и для истории команд (!! — повтор последней команды). В интерактивном режиме ! может вызывать расширение истории, что опасно в скриптах (можно отключить через set +H).

В PowerShell!— логическое НЕ:if (-not $flag)или!$flag`.

В CMD ! не имеет специального значения, если не включена задержанная расширенная переменная (setlocal enabledelayedexpansion), где !var! — доступ к переменной в цикле.

: это пустая команда. Возвращает код успеха (0). Часто используется как заглушка в циклах или для установки переменных без побочных эффектов.

Пример:

while :; do
sleep 1
done

Это бесконечный цикл, так как : всегда успешна.

В PowerShell : не является командой, но может использоваться в метках (например, :outer while (...)).


Символы пути и иерархии

/. Разделитель компонентов пути в Unix-подобных системах. Корневая директория обозначается как /.

Пример:

cd /home/user/documents

В PowerShell на Windows / тоже допустим, но официально используется \. В Bash на Windows (WSL) — /.

\. Разделитель путей в Windows. В CMD и PowerShell используется \.

Пример:

cd C:\Users\Alice\Documents

В Bash \ — escape, поэтому для пути в Windows в скриптах Bash нужно экранировать или использовать /.

. — текущая директория.
.. — родительская директория.

Используются в командах cd, cp, mv и т.д.

Пример:

cp ./config.txt ../backup/

В PowerShell и CMD смысл тот же.


Символы в PowerShell

PowerShell имеет собственную грамматику, сильно отличающуюся от Bash.

@ используется для создания хэш-таблиц (словарей) и массивов:

$hash = @{ Name = "Alice"; Age = 30 }
$array = @(1, 2, 3)

. это оператор доступа к свойствам и методам объекта:

$process = Get-Process -Id $PID
$process.Name

Также используется для sourcing скриптов: . .\script.ps1.

:: это доступ к статическим членам класса .NET:

[System.DateTime]::Now

?. Оператор (pipeline) фильтрации — alias для Where-Object:

Get-Service | ? {$_.Status -eq 'Running'}

- это префикс для параметров командлетов:

Get-ChildItem -Path C:\ -Recurse

В отличие от Unix, где флаги начинаются с -, в PowerShell они полные имена (-Recurse, -Force), а не короткие (-r, -f), хотя короткие тоже часто поддерживаются.


Символы в CMD

CMD — упрощённая оболочка Windows, с ограниченной грамматикой.

%VAR% это обращение к переменной окружения.

Пример:

echo %USERNAME%

В блоках for и if при включённой задержанной экспансии используется !VAR!.

^ это Escape-символ в CMD. Переносит строку на следующую строку или экранирует специальные символы.

Пример:

echo This is a ^
long line

&, |, >, < работают аналогично Bash, но с ограничениями: нет &&/||, нет подстановки команд вроде $(), нет здесь-документов.