ターミナル入門 — シェルの種類・管理者権限・よく使うコマンド
「ターミナル」「PowerShell」「コマンドプロンプト」「bash」…似たような黒い画面がいくつもあって混乱するので、関係を整理する。Windowsで開発する人向け。
ターミナルとシェルは別物
まずここが一番の混乱ポイント。2つは役割が違う。
| 役割 | 例 | |
|---|---|---|
| ターミナル | 文字の入出力を担当する画面側のアプリ | Windows Terminal、VS Codeの内蔵ターミナル |
| シェル | 入力されたコマンドを解釈・実行する中身のプログラム | コマンドプロンプト(cmd)、PowerShell、bash |
ターミナルは「器」、シェルは「中身」。たとえばWindows Terminalというターミナルの中で、PowerShellというシェルを動かす、という関係になっている。Windows Terminalのタブの+ボタン横のドロップダウンで「PowerShell」「コマンド プロンプト」などを選べるのは、同じ器で中身のシェルを切り替えているということ。
VS Codeの内蔵ターミナルも同じで、あれはターミナル。中で動くシェルは設定(terminal.integrated.defaultProfile.windows)で選べる。
Windowsのシェルたち
コマンドプロンプト(cmd.exe)
- Windows最古のシェル。MS-DOS由来
dircopydelなどの独自コマンド、.batファイル(バッチファイル)を実行する- 新しく覚える価値はほぼないが、古いツールの手順書やバッチファイルで今も登場する。「レガシー互換のためにある」と思えばよい
PowerShell
- Windowsの現行標準シェル。コマンドは
動詞-名詞形式(Get-ChildItemRemove-Itemなど)で、lsやcdはエイリアス(別名)として用意されている - 最大の特徴は、パイプでテキストではなくオブジェクトが流れること。
Get-Process | Where-Object { $_.CPU -gt 100 }のようにプロパティで絞り込める - 2種類あるのに注意:
- Windows PowerShell 5.1(
powershell.exe)— OSに同梱されている旧版 - PowerShell 7+(
pwsh.exe)— 別途インストールする現行版。クロスプラットフォームで機能も多い
- Windows PowerShell 5.1(
.ps1スクリプトが「実行ポリシー」でブロックされることがある。開発機ではSet-ExecutionPolicy RemoteSigned -Scope CurrentUserを一度実行しておくのが定番
Git Bash
- Git for Windowsに同梱されるbash環境。
lsgreprmなどのUnix系コマンドがWindowsでそのまま使える - Web開発の情報はUnix系コマンド前提で書かれていることが多いので、記事のコマンドをコピペしたいときに一番相性がいい
- パスの区切りが
/(C:\Users\...は/c/Users/...になる)
WSL(Windows Subsystem for Linux)
- Windows上で本物のLinux(Ubuntu等)を動かす仕組み。Git Bashが「Unixコマンドの真似ができる環境」なのに対し、WSLは本物
- Docker、Linux前提のツール、本番がLinuxのサーバー開発ではWSLが安心
- ファイルシステムがWindows側と分かれている点だけ注意(
/mnt/c/でWindows側にアクセスできるが遅い)
結局どれを使えばいいか
- 迷ったらPowerShell(Windows標準で追加インストール不要)
- Unix系コマンドの記事をよくコピペするならGit Bash
- Linux前提の開発をするならWSL
- node / npm / pnpm / git などの開発ツールはどのシェルからでも同じように動くので、シェル選びで困ることは実はあまりない
Linuxとの関係 — なぜ開発情報はUnix系前提なのか
シェルの話は、OSの系統を知ると急に見通しがよくなる。世の中のOSは大きく2系統ある。
Unix(1970年代の元祖)
├── BSD系 ──→ macOS(Unix系。ターミナルでbash/zshがそのまま動く)
└── Unixの設計を受け継いだ自由なOS ──→ Linux
├── Ubuntu / Debian
├── RedHat系(CentOS等)
└── Alpine(Docker定番)ほか多数
Windows(MS-DOS → NT系。Unixとは別系統)- bash・zsh・
lsgreprmなどはUnix系の文化。LinuxとmacOSはこの文化圏にいる - Windowsだけが別系統で、cmdやPowerShellという独自の文化を持っている
- だからWindowsでUnix系コマンドを使いたいときに、Git Bash(Unix風の環境を再現)やWSL(本物のLinuxを動かす)が必要になる
そして開発の情報がUnix系前提で書かれがちな理由:
- Webサービスの本番サーバーはほぼLinux。デプロイ先がLinuxなら、手元もLinuxと同じコマンドで動く方が都合がいい
- CIもLinux。GitHub Actionsの
runs-on: ubuntu-latestはUbuntu(Linux)で、ワークフローのrun:は基本bashで実行される - DockerコンテナもLinux。コンテナの中で打つコマンドはUnix系
- macOSがUnix系なので、開発者の多くがbash/zshで暮らしており、記事やREADMEもそれ前提になる
Windowsで開発していると「手元はPowerShell、CIはbash、サーバーもbash」という状態になりやすい。手元とそれ以外でシェルの方言が違うことを意識しておくと、CIだけ落ちる系のトラブル(パス区切り、環境変数の書き方、rm -rf が無い等)の原因に気づきやすくなる。
ちなみにmacOS/Linuxでは、ターミナルが「ターミナル.app」やGNOME Terminal等、シェルがbashやzsh(macOSの現行デフォルト)という対応になる。
管理者権限とはなにか
Windowsのアカウントには通常権限と管理者権限があり、普段のアプリは管理者アカウントでも通常権限で動いている。システムに影響する操作をするときだけ、UAC(ユーザーアカウント制御。あの暗転して「許可しますか?」と聞いてくる画面)を通して一時的に昇格する。
ターミナルを「管理者として実行」で開くと、そのシェルの中のコマンドすべてが管理者権限で動く。
管理者権限が必要になる典型例
C:\Program FilesやC:\Windows配下への書き込み- hostsファイル(
C:\Windows\System32\drivers\etc\hosts)の編集 - サービスの起動・停止、1024未満のポートの使用
- レジストリの
HKEY_LOCAL_MACHINE側の変更 - 一部のインストーラー、
winget installの一部パッケージ
開発での付き合い方
- 基本は通常権限でよい。npm install や git、プロジェクトのビルドに管理者権限は不要
- むしろ「管理者で実行したらエラーが消えた」で常用するのは危険。権限で誤魔化すと、生成物の所有者が混ざって後で別のエラーを生む
- 必要なときだけ、Windows Terminalのタブを管理者で開き直す(スタートメニューで右クリック → 管理者として実行)
- Linux/macOSの
sudo コマンドが「そのコマンドだけ昇格」に相当する。Windows 11にもsudoコマンドが追加されており、設定で有効化すれば同じ感覚で使える
よく使うコマンド対照表
同じことをしたいときのコマンドがシェルごとに違う。PowerShellはUnix風のエイリアスを持っているので実は覚えることは少ない。
| したいこと | cmd | PowerShell | bash(Git Bash/WSL) |
|---|---|---|---|
| ファイル一覧 | dir |
ls(Get-ChildItem) |
ls -la |
| ディレクトリ移動 | cd |
cd |
cd |
| 現在地の表示 | cd |
pwd |
pwd |
| フォルダ作成 | mkdir |
mkdir |
mkdir -p |
| ファイル削除 | del |
rm(Remove-Item) |
rm |
| フォルダごと削除 | rmdir /s |
rm -r -fo |
rm -rf |
| コピー | copy |
cp(Copy-Item) |
cp -r |
| 移動・リネーム | move |
mv(Move-Item) |
mv |
| 中身を表示 | type |
cat(Get-Content) |
cat |
| 文字列検索 | findstr |
Select-String |
grep |
| コマンドの場所 | where |
Get-Command |
which |
| 画面クリア | cls |
clear(cls も可) |
clear |
| 環境変数の表示 | echo %PATH% |
$env:PATH |
echo $PATH |
| 環境変数の設定 | set NAME=x |
$env:NAME = "x" |
export NAME=x |
注意点をいくつか:
- PowerShellの
lsやrmは見た目がbashと同じでもオプションが別物。rm -rfはPowerShellでは動かない(Remove-Item -Recurse -Force) - cmdの環境変数は
%NAME%、PowerShellは$env:NAME、bashは$NAME。コピペしたコマンドが動かないときはまずここを疑う - スペースを含むパスは
"で囲む。PowerShellでスペース入りパスの実行ファイルを直接動かすときは先頭に&(呼び出し演算子)を付ける:& "C:\Program Files\App\app.exe"
開発で毎日打つやつ
シェルに関係なく共通で使う開発コマンドの例:
git status # 変更状況の確認
git log --oneline # 履歴をコンパクトに
pnpm install # 依存のインストール
pnpm dev # 開発サーバー起動
npx serve out # 静的ファイルをさっと配信
node script.js # スクリプト実行Ctrl+C で実行中のコマンドを中断、↑ で履歴、Tab でパス補完。この3つのキー操作だけで体感効率が倍になる。
まとめ
- ターミナル=器、シェル=中身。Windows TerminalやVS Codeのターミナルの中で、PowerShellやbashが動いている
- Windowsのシェルは cmd(レガシー)/ PowerShell(標準)/ Git Bash(Unix風) / WSL(本物のLinux)。迷ったらPowerShell、Unix系記事のコピペが多いならGit Bash
- OSはUnix系(Linux・macOS)とWindowsの2系統。サーバー・CI・DockerはLinuxなので、開発情報はUnix系(bash)前提が多い
- 管理者権限は「必要なときだけ昇格」が原則。開発の日常作業には不要
- コマンドはシェルごとに方言がある。動かないときは環境変数の書き方とオプションの違いをまず疑う