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, но с ограничениями: нет &&/||, нет подстановки команд вроде $(), нет здесь-документов.