Терминал — окно для текстовых команд, оболочка (bash, zsh, PowerShell) — программа, которая эти команды читает и выполняет. Разработчику достаточно десятка команд: перейти в папку (cd), посмотреть содержимое (ls), создать и удалить файлы, запустить node или npm, задать переменную окружения и соединить команды конвейером. Ниже — все эти шаги с реальным выводом и соответствиями для PowerShell в Windows.
После материала вы сможете
- перемещаться по файловой системе командами
pwd,ls,cdи отличать абсолютный путь от относительного - создавать, копировать, переименовывать и удалять файлы и папки, не рискуя данными
- запускать
nodeиnpmс аргументами и объяснить, как оболочка находит программу через PATH - задавать переменные окружения, соединять команды конвейером и перенаправлять вывод в bash и PowerShell
Что знать заранее
Проверено на
bash 5.2 (Ubuntu 24.04)Git Bash 5.3 (Git for Windows 2.55)PowerShell 7.6GNU coreutils 9.4Node.js 24.18npm 11.16
Сверено с документацией: 11 октября 2026 г.
Содержание
- Терминал, оболочка и команда: что есть что
- Windows, macOS и Linux: одна идея, разные оболочки
- Навигация: pwd, ls, cd и пути
- Файлы и папки: mkdir, cp, mv, rm — и почему rm -rf опасен
- Запуск программ, PATH и переменные окружения
- Потоки и конвейеры: |, >, >>, 2> и grep
- Права доступа: chmod и исполняемые скрипты
- Практика: создаём и запускаем проект из терминала
Терминал, оболочка и команда: что есть что
Почти любой инструмент разработки — Node.js, npm, Git, Docker — в первую очередь работает из командной строки. В графическом интерфейсе вы нажимаете кнопки, в терминале пишете короткие текстовые команды, и компьютер отвечает текстом. Это быстрее, точнее и легко повторяется: ту же последовательность команд можно сохранить в файл и запустить снова.
Три слова часто путают. MDN разводит их так: терминал — программа-окно, которая запускает оболочку и подключается к ней; оболочка (shell) — ваша сессия со своими настройками, она разбирает и выполняет команды; командная строка — та самая строка, где мигает курсор. На практике слова «терминал» и «командная строка» используют как синонимы, и это нормально.
Терминал
- Что это
- Окно, которое показывает текст и передаёт ввод оболочке
- Примеры
- Terminal в macOS, Windows Terminal, встроенный терминал VS Code
Оболочка
- Что это
- Программа, которая читает команду, находит и запускает нужную программу
- Примеры
- bash, zsh, PowerShell
Команда
- Что это
- Имя программы или встроенной команды оболочки плюс аргументы
- Примеры
ls -l src,node index.js --port 3000
Приглашение (prompt)
- Что это
- Строка перед курсором: оболочка готова принять команду
- Примеры
$в bash,PS>в PowerShell
Windows, macOS и Linux: одна идея, разные оболочки
В Linux терминал есть всегда, обычно с оболочкой bash. В macOS начиная с версии 10.15 оболочка по умолчанию — zsh (так пишет поддержка Apple); команды этого урока в ней работают так же. В Windows по умолчанию открывается PowerShell, а для привычных Unix-команд ставят Git Bash — он входит в Git for Windows и эмулирует bash — или полноценный Linux через WSL, который рекомендует MDN.
Главное отличие PowerShell: его команды (cmdlet) передают друг другу не текст, а объекты .NET. Для удобства в нём есть псевдонимы с привычными именами: ls, cd, cat, rm вызывают «родные» команды PowerShell. Проверить, что скрывается за псевдонимом, можно так:
PS> Get-Command ls, cd, pwd, cat, rm, cp, mv | Select-Object Name, Definition
Name Definition
---- ----------
ls Get-ChildItem
cd Set-Location
pwd Get-Location
cat Get-Content
rm Remove-Item
cp Copy-Item
mv Move-ItemГде я
- bash
pwd- PowerShell 7
Get-Location(pwd)
Список файлов
- bash
ls -la- PowerShell 7
Get-ChildItem -Force(ls)
Перейти в папку
- bash
cd src- PowerShell 7
Set-Location src(cd)
Создать папку
- bash
mkdir -p a/b- PowerShell 7
New-Item -ItemType Directory a/b
Создать пустой файл
- bash
touch README.md- PowerShell 7
New-Item README.md -ItemType File
Показать файл
- bash
cat file.txt- PowerShell 7
Get-Content file.txt(cat)
Копировать / переместить
- bash
cp a b/mv a b- PowerShell 7
Copy-Item a b/Move-Item a b
Удалить папку с содержимым
- bash
rm -r dir- PowerShell 7
Remove-Item -Recurse dir
Найти строки
- bash
grep api access.log- PowerShell 7
Select-String api access.log
Посчитать строки
- bash
… | wc -l- PowerShell 7
(… | Measure-Object).Count
Переменная окружения
- bash
export APP_ENV=test- PowerShell 7
$env:APP_ENV = "test"
Где лежит программа
- bash
command -v node- PowerShell 7
(Get-Command node).Source
Навигация: pwd, ls, cd и пути
Оболочка всегда «находится» в какой-то папке — текущем рабочем каталоге. При запуске это домашняя папка пользователя. Команда pwd показывает, где вы, ls — что лежит рядом, cd — переходит в другую папку. mkdir -p создаёт папку вместе со всеми недостающими родителями.
$ pwd
/home/ubuntu
$ mkdir -p projects/hello/src
$ cd projects/hello
$ pwd
/home/ubuntu/projects/hello
$ ls
src
$ cd src
$ pwd
/home/ubuntu/projects/hello/src
$ cd ..
$ cd ../..
$ pwd
/home/ubuntu
$ cd /home/ubuntu/projects/hello/src
$ cd ~
$ pwd
/home/ubuntu- Абсолютный путь начинается с корня
/:/home/ubuntu/projects/hello/srcведёт в одно и то же место, где бы вы ни находились. - Относительный путь отсчитывается от текущей папки:
cd srcработает, только еслиsrcлежит прямо здесь. ..— родительская папка,.— текущая,~— домашняя.cdбез аргументов тоже возвращает домой.- Клавиша Tab дописывает имя файла или папки, если начало уже введено: меньше опечаток и быстрее.
- В Windows пути пишутся через обратную косую черту (
C:\Users\name), а Git Bash показывает тот же диск как/c/Users/name.
Файлы и папки: mkdir, cp, mv, rm — и почему rm -rf опасен
touch создаёт пустой файл, cp копирует, mv перемещает или переименовывает: переименование — это перемещение в ту же папку под новым именем. rm удаляет файл, rmdir — только пустую папку, а rm -r — папку со всем содержимым. ls -l показывает подробный список: права, владельца, размер и дату.
$ cd ~/projects/hello
$ touch README.md
$ echo 'console.log("hello")' > src/index.js
$ cat src/index.js
console.log("hello")
$ cp src/index.js src/index.backup.js
$ mv src/index.backup.js old.js
$ ls -l . src
.:
total 8
-rw-r--r-- 1 ubuntu ubuntu 0 Oct 11 22:02 README.md
-rw-r--r-- 1 ubuntu ubuntu 21 Oct 11 22:02 old.js
drwxr-xr-x 2 ubuntu ubuntu 4096 Oct 11 22:02 src
src:
total 4
-rw-r--r-- 1 ubuntu ubuntu 21 Oct 11 22:02 index.js
$ rm old.js
$ rmdir src
rmdir: failed to remove 'src': Directory not empty
$ rm -r src
$ ls
README.md- Перед удалением выполните
pwdиlsс тем же путём — убедитесь, что видите именно то, что собираетесь стереть. - Для ручной работы используйте
rm -i: оболочка спросит подтверждение для каждого файла. - Не копируйте из интернета команды с
rm -rfиsudo, пока не понимаете каждую часть. - Важные эксперименты проводите в отдельной тестовой папке или в контейнере.
Запуск программ, PATH и переменные окружения
Когда вы пишете node index.js --port 3000, первое слово — имя программы, остальные — аргументы: программа получит их списком и сама решит, что с ними делать. Флаги обычно начинаются с дефиса (-l) или двух дефисов (--port). Если в имени нет косой черты, оболочка ищет программу по папкам из переменной окружения PATH — по порядку, пока не найдёт исполняемый файл. Так описано в стандарте POSIX; в Linux и macOS папки в PATH разделены двоеточием, в Windows — точкой с запятой.
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ command -v bash ls
/usr/bin/bash
/usr/bin/ls
$ type cd
cd is a shell builtin
$ node --version
bash: node: command not found
$ echo $?
127command -v показывает, какой файл будет запущен, а type отличает встроенные команды оболочки: cd — не программа, а часть самой оболочки. Код возврата (exit status) лежит в переменной $?: 0 — успех, любое другое число — ошибка. Стандарт POSIX закрепляет за «команда не найдена» код 127, за «найдена, но не исполняется» — 126. Сообщение command not found почти всегда значит одно из двух: программа не установлена или её папки нет в PATH (часто помогает перезапуск терминала после установки).
Переменные окружения — пары «имя=значение», которые процесс получает от родителя при запуске. Через них программам передают настройки, не меняя код: режим работы, порт, адрес базы данных. Обычная переменная оболочки видна только ей самой; export делает её частью окружения дочерних процессов. Запись APP_ENV=test команда задаёт переменную только для одной команды.
$ echo $HOME
/home/ubuntu
$ GREETING=hello
$ echo $GREETING
hello
$ bash -c 'echo "child: [$GREETING]"'
child: []
$ export GREETING
$ bash -c 'echo "child: [$GREETING]"'
child: [hello]
$ APP_ENV=test bash -c 'echo "APP_ENV=$APP_ENV"'
APP_ENV=test
$ echo "after: [$APP_ENV]"
after: []
$ unset GREETINGВ PowerShell переменные окружения доступны через $env:ИМЯ. Документация Microsoft уточняет: такое изменение действует только в текущей сессии и наследуется дочерними процессами; для постоянного значения переменную прописывают в профиль PowerShell или в системные настройки. Записи APP_ENV=test команда в PowerShell нет — переменную задают отдельной строкой.
PS> $env:APP_ENV = "test"
PS> pwsh -NoProfile -c '"child: [$env:APP_ENV]"'
child: [test]
PS> Remove-Item Env:APP_ENV
PS> "[$env:APP_ENV]"
[]
PS> $env:PATH -split ";" | Select-String nodejs
C:\Program Files\nodejsПотоки и конвейеры: |, >, >>, 2> и grep
У каждой программы есть три стандартных потока: ввод (stdin, номер 0), вывод (stdout, 1) и ошибки (stderr, 2). По умолчанию вывод и ошибки идут на экран. Конвейер | соединяет вывод одной команды со вводом следующей — как сказано в POSIX, стандартный вывод command1 подключается к стандартному вводу command2. Так из маленьких утилит собираются нужные инструменты: grep отбирает строки, wc -l считает их, sort сортирует.
$ printf 'GET /\nPOST /api/lead\nGET /about\nGET /api/health\n' > access.log
$ grep api access.log
POST /api/lead
GET /api/health
$ grep api access.log | wc -l
2
$ grep api access.log > api.txt
$ echo 'GET /api/price' >> api.txt
$ cat api.txt
POST /api/lead
GET /api/health
GET /api/price
$ ls missing.txt
ls: cannot access 'missing.txt': No such file or directory
$ echo $?
2
$ ls missing.txt 2> errors.txt
$ cat errors.txt
ls: cannot access 'missing.txt': No such file or directory
$ mkdir demo && cd demo && echo "created and entered"
created and entered
$ cd ~
$ ls missing.txt && echo "never printed" || echo "ls failed, exit code $?"
ls: cannot access 'missing.txt': No such file or directory
ls failed, exit code 2a | b
- Что делает
- Вывод
aстановится вводомb
a > file
- Что делает
- Записать вывод в файл, перезаписав его
a >> file
- Что делает
- Дописать вывод в конец файла
a 2> file
- Что делает
- Записать в файл только ошибки
a > file 2>&1
- Что делает
- Записать в файл и вывод, и ошибки
a && b
- Что делает
- Запустить
b, только еслиaзавершилась успешно (код 0)
a || b
- Что делает
- Запустить
b, только еслиaзавершилась с ошибкой
Операторы >, >>, 2>, |, && и || работают и в PowerShell 7 — два последних появились именно в седьмой версии. Но по конвейеру PowerShell идут объекты, поэтому вместо grep и wc там используют Select-String и Measure-Object. Типичная ошибка новичка — > вместо >>: одна лишняя угловая скобка тихо стирает содержимое файла.
Права доступа: chmod и исполняемые скрипты
В Linux и macOS у каждого файла есть права для трёх групп: владелец, группа и все остальные. Для каждой — чтение (r), запись (w) и выполнение (x). В выводе ls -l первая буква — тип (d у папки, - у файла), дальше три тройки прав. Скрипт можно запустить по пути ./build.sh, только если у него есть право x; иначе оболочка ответит Permission denied.
$ printf '#!/usr/bin/env bash\necho "Build started in $(pwd)"\n' > build.sh
$ ls -l build.sh
-rw-r--r-- 1 ubuntu ubuntu 51 Oct 11 22:02 build.sh
$ ./build.sh
bash: ./build.sh: Permission denied
$ chmod +x build.sh
$ ls -l build.sh
-rwxr-xr-x 1 ubuntu ubuntu 51 Oct 11 22:02 build.sh
$ ./build.sh
Build started in /home/ubuntu
$ chmod 600 build.sh
$ ls -l build.sh
-rw------- 1 ubuntu ubuntu 51 Oct 11 22:02 build.shchmod +x build.sh
- Права
- Добавить выполнение всем
- Когда применять
- Свой скрипт, который нужно запускать как
./build.sh
chmod 755 (rwxr-xr-x)
- Права
- Владелец — всё, остальные — чтение и запуск
- Когда применять
- Скрипты и папки, доступные другим
chmod 644 (rw-r--r--)
- Права
- Владелец — чтение и запись, остальные — чтение
- Когда применять
- Обычные файлы проекта
chmod 600 (rw-------)
- Права
- Только владелец, без запуска
- Когда применять
- Приватные файлы: ключи,
.envна сервере
Цифры — восьмеричная запись: r = 4, w = 2, x = 1, сумма даётся для каждой группы. Первая строка скрипта #!/usr/bin/env bash (shebang) говорит системе, какой программой его выполнять. Без права x скрипт всё равно можно запустить явно: bash build.sh.
Практика: создаём и запускаем проект из терминала
Соберём всё вместе: создадим папку проекта, инициализируем npm, напишем скрипт, который читает аргументы и переменную окружения, и запустим его тремя способами. Нужен установленный Node.js. В Node.js аргументы командной строки доступны через process.argv, переменные окружения — через process.env.
const name = process.env.USER_NAME ?? "world";
const args = process.argv.slice(2);
console.log(`Hello, ${name}!`);
console.log(`Arguments: ${args.join(" ") || "none"}`);$ node --version
v24.18.0
$ npm --version
11.16.0
$ mkdir -p ~/projects/hello-cli && cd ~/projects/hello-cli
$ npm init -y > /dev/null
$ ls
package.json
$ node index.js
Hello, world!
Arguments: none
$ node index.js --port 3000
Hello, world!
Arguments: --port 3000
$ USER_NAME=Asel node index.js
Hello, Asel!
Arguments: none
$ npm pkg set scripts.start="node index.js"
$ npm start -- --verbose
> hello-cli@1.0.0 start
> node index.js --verbose
Hello, world!
Arguments: --verbosels и node index.js).Двойной дефис в npm start -- --verbose — граница: всё, что после него, npm не разбирает сам, а передаёт скрипту, как описано в документации npm run. Тот же сценарий в PowerShell 7:
PS> New-Item -ItemType Directory hello-cli -Force | Out-Null
PS> Set-Location hello-cli
PS> npm init -y > $null
PS> node index.js --port 3000
Hello, world!
Arguments: --port 3000
PS> $env:USER_NAME = "Asel"
PS> node index.js
Hello, Asel!
Arguments: none
PS> Remove-Item Env:USER_NAME
PS> npm pkg set scripts.start="node index.js"
PS> npm start -- --verbose
> hello-cli@1.0.0 start
> node index.js --verbose
Hello, world!
Arguments: --verbosenode --versionпечатает версию, а неcommand not found- Без переменной скрипт печатает
Hello, world!, сUSER_NAME=Asel—Hello, Asel! - Аргументы после имени файла появляются в строке
Arguments: - В
package.jsonпоявился скриптstart, иnpm startего запускает
Следующий шаг — Git: он работает из того же терминала, и уверенная навигация по папкам понадобится с первой команды.
Как проверено5 · пройденосверено 11 октября 2026 г.
- запущено, работает
Навигация, файлы, PATH/command not found, переменные окружения, конвейеры и перенаправления, chmod (shellsession-блоки)
docker run --rm ubuntu:24.04 (Ubuntu 24.04.5, bash 5.2.21, coreutils 9.4) от пользователя ubuntu; интерактивный bash в псевдотерминале через script(1), ввод из файла — вывод в статье скопирован из транскрипта, сокращения помечены в подписях
- запущено, работает
index.js + сценарий npm init / node / npm pkg set / npm start (bash)
docker run --rm node:24.18.0-bookworm-slim (Node.js 24.18.0, npm 11.16.0), тот же транскрипт-раннер
- запущено, работает
PowerShell-блоки: псевдонимы Get-Command, $env:, Select-String, практика с npm
pwsh 7.6.6 локально в Windows 11 (скрипты ps.ps1, ps2.ps1 во временной папке); дополнительно подтверждено, что запись APP_ENV=test cmd в PowerShell не распознаётся
- запущено, работает
Поведение Git Bash: пути /c/Users, chmod на NTFS
Git Bash 5.3.15 (Git for Windows 2.55.0) локально: скрипт с shebang показан как -rwxr-xr-x до chmod +x, chmod 600 не меняет ls -l
- запущено, работает
Упражнения: журнал запусков (>, >>, grep | wc -l) и setup.sh
node:24.18.0-bookworm-slim (bash 5.2) и локальный Git Bash 5.3; setup.sh проверен ShellCheck (koalaman/shellcheck:stable) — без замечаний; build-скрипт сверяет код в статье с проверенным файлом
«Запущено» — код выполнен во временном проекте или контейнере, вывод в статье взят из прогона. «Частично» — проверено с заглушками вместо внешних сервисов. «Не запускалось» — нужны устройство, аккаунт или ключ; шаги сверены с официальной документацией. Файлы проверочного проекта и логи запусков сохранены в архиве InterLAB.
Источники
- MDN — Command line crash course
- POSIX.1-2024 — Shell Command Language (pipelines, redirection, AND/OR lists, command search)
- POSIX.1-2024 — Environment Variables (PATH, HOME)
- Microsoft Learn — about_Environment_Variables (PowerShell)
- Microsoft Learn — about_Pipelines (PowerShell)
- Apple Support — Use zsh as the default shell on Mac