Как делать11 октября 2026 г.9 мин чтения
Docker и деплойШаг 1 из 8

Терминал и командная строка для разработчика

Коротко

Терминал — окно для текстовых команд, оболочка (bash, zsh, PowerShell) — программа, которая эти команды читает и выполняет. Разработчику достаточно десятка команд: перейти в папку (cd), посмотреть содержимое (ls), создать и удалить файлы, запустить node или npm, задать переменную окружения и соединить команды конвейером. Ниже — все эти шаги с реальным выводом и соответствиями для PowerShell в Windows.

Пошаговый урокУровень: НачальныйТерминал и командная строкаПрактика: ~45–90 мин

После материала вы сможете

  • перемещаться по файловой системе командами 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 г.

Содержание
  1. 01Терминал, оболочка и команда: что есть что
  2. 02Windows, macOS и Linux: одна идея, разные оболочки
  3. 03Навигация: pwd, ls, cd и пути
  4. 04Файлы и папки: mkdir, cp, mv, rm — и почему rm -rf опасен
  5. 05Запуск программ, PATH и переменные окружения
  6. 06Потоки и конвейеры: |, >, >>, 2> и grep
  7. 07Права доступа: chmod и исполняемые скрипты
  8. 08Практика: создаём и запускаем проект из терминала

Терминал, оболочка и команда: что есть что

Почти любой инструмент разработки — 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. Проверить, что скрывается за псевдонимом, можно так:

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
PowerShell 7.6 в Windows 11: какие команды стоят за привычными именами (реальный вывод).

Где я

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
Шпаргалка: bash (macOS, Linux, Git Bash) и PowerShell 7

Навигация: pwd, ls, cd и пути

Оболочка всегда «находится» в какой-то папке — текущем рабочем каталоге. При запуске это домашняя папка пользователя. Команда pwd показывает, где вы, ls — что лежит рядом, cd — переходит в другую папку. mkdir -p создаёт папку вместе со всеми недостающими родителями.

terminal
$ 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
bash 5.2, Ubuntu 24.04, пользователь 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 показывает подробный список: права, владельца, размер и дату.

terminal
$ 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
bash 5.2, Ubuntu 24.04: создание, копирование, переименование и удаление (реальный вывод, часть шагов сессии опущена).
  • Перед удалением выполните pwd и ls с тем же путём — убедитесь, что видите именно то, что собираетесь стереть.
  • Для ручной работы используйте rm -i: оболочка спросит подтверждение для каждого файла.
  • Не копируйте из интернета команды с rm -rf и sudo, пока не понимаете каждую часть.
  • Важные эксперименты проводите в отдельной тестовой папке или в контейнере.

Запуск программ, PATH и переменные окружения

Когда вы пишете node index.js --port 3000, первое слово — имя программы, остальные — аргументы: программа получит их списком и сама решит, что с ними делать. Флаги обычно начинаются с дефиса (-l) или двух дефисов (--port). Если в имени нет косой черты, оболочка ищет программу по папкам из переменной окружения PATH — по порядку, пока не найдёт исполняемый файл. Так описано в стандарте POSIX; в Linux и macOS папки в PATH разделены двоеточием, в Windows — точкой с запятой.

terminal
$ 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 $?
127
bash 5.2, чистый образ Ubuntu 24.04 без Node.js: поиск программ по PATH и код возврата 127 (реальный вывод, часть шагов сессии опущена).

command -v показывает, какой файл будет запущен, а type отличает встроенные команды оболочки: cd — не программа, а часть самой оболочки. Код возврата (exit status) лежит в переменной $?: 0 — успех, любое другое число — ошибка. Стандарт POSIX закрепляет за «команда не найдена» код 127, за «найдена, но не исполняется» — 126. Сообщение command not found почти всегда значит одно из двух: программа не установлена или её папки нет в PATH (часто помогает перезапуск терминала после установки).

Переменные окружения — пары «имя=значение», которые процесс получает от родителя при запуске. Через них программам передают настройки, не меняя код: режим работы, порт, адрес базы данных. Обычная переменная оболочки видна только ей самой; export делает её частью окружения дочерних процессов. Запись APP_ENV=test команда задаёт переменную только для одной команды.

terminal
$ 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
bash 5.2, Ubuntu 24.04: обычная переменная, export и переменная на одну команду (реальный вывод, часть шагов сессии опущена).

В PowerShell переменные окружения доступны через $env:ИМЯ. Документация Microsoft уточняет: такое изменение действует только в текущей сессии и наследуется дочерними процессами; для постоянного значения переменную прописывают в профиль PowerShell или в системные настройки. Записи APP_ENV=test команда в PowerShell нет — переменную задают отдельной строкой.

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
PowerShell 7.6, Windows 11: переменная окружения для сессии и поиск папки Node.js в PATH (реальный вывод двух запусков).

Потоки и конвейеры: |, >, >>, 2> и grep

У каждой программы есть три стандартных потока: ввод (stdin, номер 0), вывод (stdout, 1) и ошибки (stderr, 2). По умолчанию вывод и ошибки идут на экран. Конвейер | соединяет вывод одной команды со вводом следующей — как сказано в POSIX, стандартный вывод command1 подключается к стандартному вводу command2. Так из маленьких утилит собираются нужные инструменты: grep отбирает строки, wc -l считает их, sort сортирует.

terminal
$ 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 2
bash 5.2, Ubuntu 24.04: поиск по журналу запросов, перенаправления и коды возврата (реальный вывод, часть шагов опущена).

a | 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.

terminal
$ 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.sh
bash 5.2, Ubuntu 24.04, пользователь ubuntu: права нового файла, chmod +x и chmod 600 (реальный вывод).

chmod +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.

index.js
const name = process.env.USER_NAME ?? "world";
const args = process.argv.slice(2);
console.log(`Hello, ${name}!`);
console.log(`Arguments: ${args.join(" ") || "none"}`);
Создайте файл в редакторе в папке ~/projects/hello-cli. Проверено: Node.js 24.18.
terminal
$ 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: --verbose
bash 5.2 в образе node:24.18.0-bookworm-slim (реальный вывод; файл index.js создан между шагами ls и node index.js).

Двойной дефис в npm start -- --verbose — граница: всё, что после него, npm не разбирает сам, а передаёт скрипту, как описано в документации npm run. Тот же сценарий в PowerShell 7:

PowerShell
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: --verbose
PowerShell 7.6, Windows 11, Node.js 24.18 (реальный вывод).
  • node --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.

Расскажите о задаче — мы изучим запрос и свяжемся с вами

Есть задача?
Обсудим и оценим — бесплатно.

Расскажите о продукте или проблеме. Предложим архитектуру, срок и стоимость первой версии после изучения задачи.

  • Оценка объёма и рисков до старта
  • NDA — по вашему или нашему шаблону
  • Старт работ в течение недели

Не присылайте через форму пароли, ключи доступа и исходный код — безопасную передачу доступа обсудим отдельно.

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