← 記事一覧へ

ターミナル入門 — シェルの種類・管理者権限・よく使うコマンド

terminalwindows

「ターミナル」「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由来
  • dir copy del などの独自コマンド、.bat ファイル(バッチファイル)を実行する
  • 新しく覚える価値はほぼないが、古いツールの手順書やバッチファイルで今も登場する。「レガシー互換のためにある」と思えばよい

PowerShell

  • Windowsの現行標準シェル。コマンドは 動詞-名詞 形式(Get-ChildItem Remove-Item など)で、lscdエイリアス(別名)として用意されている
  • 最大の特徴は、パイプでテキストではなくオブジェクトが流れること。Get-Process | Where-Object { $_.CPU -gt 100 } のようにプロパティで絞り込める
  • 2種類あるのに注意:
    • Windows PowerShell 5.1powershell.exe)— OSに同梱されている旧版
    • PowerShell 7+pwsh.exe)— 別途インストールする現行版。クロスプラットフォームで機能も多い
  • .ps1 スクリプトが「実行ポリシー」でブロックされることがある。開発機では Set-ExecutionPolicy RemoteSigned -Scope CurrentUser を一度実行しておくのが定番

Git Bash

  • Git for Windowsに同梱されるbash環境。ls grep rm などの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・ls grep rm などは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 FilesC:\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 lsGet-ChildItem ls -la
ディレクトリ移動 cd cd cd
現在地の表示 cd pwd pwd
フォルダ作成 mkdir mkdir mkdir -p
ファイル削除 del rmRemove-Item rm
フォルダごと削除 rmdir /s rm -r -fo rm -rf
コピー copy cpCopy-Item) cp -r
移動・リネーム move mvMove-Item mv
中身を表示 type catGet-Content cat
文字列検索 findstr Select-String grep
コマンドの場所 where Get-Command which
画面クリア cls clearcls も可) clear
環境変数の表示 echo %PATH% $env:PATH echo $PATH
環境変数の設定 set NAME=x $env:NAME = "x" export NAME=x

注意点をいくつか:

  • PowerShellの lsrm は見た目が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)前提が多い
  • 管理者権限は「必要なときだけ昇格」が原則。開発の日常作業には不要
  • コマンドはシェルごとに方言がある。動かないときは環境変数の書き方とオプションの違いをまず疑う