Linux「command not found」エラーの原因と解決方法|PATH・シェル設定を徹底解説

Linux「command not found」エラーの原因と解決方法|PATH・シェル設定を徹底解説

Linuxを使っていれば誰もが遭遇するエラーです。原因はシンプルですが、「コマンドがインストールされていない」以外にもいくつかのパターンがあり、状況によって対処法が変わります。

本記事では以下の疑問に答えます。

  • 「command not found」が出る原因はどれか
  • インストール済みなのに出る場合の対処法
  • PATH の設定方法と仕組み
  • sudo 時だけ出る場合の対処法
  • シェル別(bash・zsh・fish)の設定ファイルの場所
  • よく使うコマンド別の解決策


目次

結論:先に答えを出す

# ① まずコマンドの場所を探す
which コマンド名
whereis コマンド名
type コマンド名

# ② 見つからなければインストールされているか確認
dpkg -l | grep コマンド名          # Debian/Ubuntu
rpm -qa | grep コマンド名          # RHEL/CentOS/Fedora

# ③ インストールされていなければインストール
sudo apt install コマンド名        # Debian/Ubuntu
sudo dnf install コマンド名        # RHEL/CentOS/Fedora

# ④ インストール済みなのに出る場合はPATHを確認
echo $PATH
which コマンド名  # フルパスを探す

# ⑤ PATHに追加(一時的)
export PATH="$PATH:/追加するディレクトリ"

# ⑥ PATHに追加(恒久的・bash の場合)
echo 'export PATH="$PATH:/追加するディレクトリ"' >> ~/.bashrc
source ~/.bashrc

「command not found」が出る原因

大きく分けると5つのパターンがあります。

パターン1:コマンドがそもそもインストールされていない
  → インストールすれば解決

パターン2:インストール済みだがPATHが通っていない
  → PATH に追加すれば解決

パターン3:コマンド名やオプションのタイポ
  → 正しいコマンド名を確認すれば解決

パターン4:sudo 時だけ出る
  → sudo の PATH 設定の問題

パターン5:シェルの設定ファイルが読み込まれていない
  → source または再ログインで解決

それぞれ順に解説します。


パターン1:コマンドがインストールされていない

まずインストール状況を確認する

# コマンドの場所を探す(インストール済みかどうかの確認)
which git
# /usr/bin/git  ← パスが返れば使える
# (何も返らなければインストールされていない)

whereis git
# git: /usr/bin/git /usr/share/man/man1/git.1.gz
# (バイナリ・ソース・マニュアルのパスを全部表示)

type git
# git is /usr/bin/git  ← パスが返れば使える
# git: not found       ← 見つからない

# パッケージとしてインストールされているか確認(Debian/Ubuntu)
dpkg -l git
dpkg -l | grep git

# パッケージとしてインストールされているか確認(RHEL/CentOS/Fedora)
rpm -qa | grep git
dnf list installed | grep git

どのパッケージをインストールすればいいか調べる

# コマンド名からパッケージを調べる(Debian/Ubuntu)
apt search コマンド名
apt-file search bin/コマンド名  # ファイルからパッケージを検索

# 例:jq コマンドが欲しい
apt search jq
sudo apt install jq

# 例:netstat コマンドが欲しい
apt search netstat
# → net-tools パッケージに含まれる
sudo apt install net-tools

# コマンドがどのパッケージに含まれるか調べる(Ubuntu)
sudo apt install apt-file
sudo apt-file update
apt-file search /usr/bin/コマンド名
# RHEL/CentOS/Fedora でコマンドからパッケージを調べる
dnf provides コマンド名
dnf provides "*/bin/コマンド名"

# 例
dnf provides netstat
# → net-tools パッケージ
sudo dnf install net-tools

よく「command not found」になるコマンドとインストール方法

ネットワーク系

# netstat(ss コマンドが現代的な代替)
sudo apt install net-tools       # Ubuntu/Debian
sudo dnf install net-tools       # RHEL系

# ss はほぼ必ず使える(iproute2 パッケージ)
ss -tnp

# ifconfig(ip コマンドが現代的な代替)
sudo apt install net-tools
# または
ip addr show  # 代替コマンド

# nmap
sudo apt install nmap

# dig / nslookup
sudo apt install dnsutils        # Ubuntu/Debian
sudo dnf install bind-utils      # RHEL系

# traceroute
sudo apt install traceroute
# または
tracepath ホスト名  # 代替コマンド(多くの環境でデフォルト)

# curl / wget
sudo apt install curl wget

# nc(netcat)
sudo apt install netcat-openbsd  # Ubuntu/Debian
sudo dnf install nmap-ncat       # RHEL系

テキスト処理系

# jq(JSON処理)
sudo apt install jq

# awk(通常はプリインストール済み)
sudo apt install gawk

# sed(通常はプリインストール済み)
sudo apt install sed

# tree(ディレクトリ構造表示)
sudo apt install tree

# pv(パイプの進捗表示)
sudo apt install pv

# ripgrep(rg)
sudo apt install ripgrep         # Ubuntu 18.10以降
# それ以前のUbuntuはバイナリを直接取得

# fzf(ファジーファインダー)
sudo apt install fzf

開発系

# git
sudo apt install git

# make
sudo apt install make
# または開発ツール一式
sudo apt install build-essential  # Ubuntu/Debian
sudo dnf groupinstall "Development Tools"  # RHEL系

# gcc / g++
sudo apt install gcc g++

# python3 / pip3
sudo apt install python3 python3-pip

# node / npm
# nvm(Node Version Manager)経由が推奨
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install --lts

# docker
# 公式インストールスクリプトを使う
curl -fsSL https://get.docker.com | sh

# kubectl
curl -LO "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

システム管理系

# htop(プロセスモニタ)
sudo apt install htop

# lsof(開いているファイルの確認)
sudo apt install lsof

# strace(システムコールのトレース)
sudo apt install strace

# tcpdump(パケットキャプチャ)
sudo apt install tcpdump

# vim / neovim
sudo apt install vim
sudo apt install neovim

# tmux
sudo apt install tmux

# zip / unzip
sudo apt install zip unzip

# rsync
sudo apt install rsync

# sponge(moreutils)
sudo apt install moreutils

パターン2:インストール済みだがPATHが通っていない

PATH の仕組み

# PATH の確認
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# コマンドを入力すると、PATH の左から順にディレクトリを探す
# 見つかったら実行、最後まで見つからなければ "command not found"

コマンドの場所を探す

# フルパスを指定して実行できるか試す
/usr/local/bin/コマンド名
/opt/homebrew/bin/コマンド名    # macOS Homebrew
~/.local/bin/コマンド名         # ユーザーローカルインストール

# find でバイナリを探す
find /usr -name "コマンド名" 2>/dev/null
find /opt -name "コマンド名" 2>/dev/null
find $HOME -name "コマンド名" 2>/dev/null

# locate で探す(インデックスが必要)
sudo apt install mlocate
sudo updatedb
locate コマンド名 | grep bin

PATH に追加する

一時的に追加(現在のセッションのみ)

# PATH の末尾に追加
export PATH="$PATH:/usr/local/myapp/bin"

# PATH の先頭に追加(優先度を高くしたい場合)
export PATH="/usr/local/myapp/bin:$PATH"

# 確認
echo $PATH
which コマンド名

恒久的に追加

bash の場合:

# ~/.bashrc に追記(インタラクティブシェル用)
echo 'export PATH="$PATH:/usr/local/myapp/bin"' >> ~/.bashrc

# 即時反映
source ~/.bashrc
# または
. ~/.bashrc

zsh の場合:

# ~/.zshrc に追記
echo 'export PATH="$PATH:/usr/local/myapp/bin"' >> ~/.zshrc

# 即時反映
source ~/.zshrc

全ユーザーに適用(システム全体):

# /etc/environment(推奨:シンプルで確実)
sudo vi /etc/environment
# PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/myapp/bin"

# /etc/profile.d/ にファイルを追加(スクリプト形式)
sudo vi /etc/profile.d/myapp.sh
# export PATH="$PATH:/usr/local/myapp/bin"
sudo chmod +x /etc/profile.d/myapp.sh

よくある PATH 問題のパターン

Homebrew(macOS)

# Homebrew でインストールしたコマンドが見つからない
brew install コマンド名
# → command not found

# Homebrew の PATH を確認
brew --prefix
# /opt/homebrew  (Apple Silicon Mac)
# /usr/local     (Intel Mac)

# ~/.zshrc または ~/.bashrc に追加
eval "$(/opt/homebrew/bin/brew shellenv)"  # Apple Silicon
eval "$(/usr/local/bin/brew shellenv)"     # Intel

pipx / pip でインストールしたコマンド

# pip でインストールしたコマンドが見つからない
pip install black
black --version
# zsh: command not found: black

# pipx でインストールしたコマンドの場所
~/.local/bin/black

# PATH に追加
export PATH="$PATH:$HOME/.local/bin"
echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc

# pipx を使う方が管理しやすい
sudo apt install pipx
pipx ensurepath  # 自動で PATH を設定してくれる
pipx install black

nvm / rbenv / pyenv などのバージョンマネージャ

# nvm のコマンドが見つからない
nvm install 20
# command not found: nvm

# nvm は関数としてシェルに読み込む必要がある
# ~/.bashrc または ~/.zshrc に追記
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

source ~/.bashrc

# rbenv の場合
eval "$(rbenv init -)"

# pyenv の場合
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

/usr/local/bin にインストールしたバイナリ

# 手動でバイナリを配置したが見つからない
sudo cp myapp /usr/local/bin/
myapp
# command not found

# 実行権限が付いているか確認
ls -la /usr/local/bin/myapp
chmod +x /usr/local/bin/myapp

# PATH に /usr/local/bin が含まれているか確認
echo $PATH | grep local

パターン3:コマンド名のタイポ・違い

よくある間違い

# ❌ よくある間違い → ✅ 正しいコマンド
python                  # → python3
pip                     # → pip3
vi                      # → vim(環境による)
cls                     # → clear(Windowsのクセ)
ipconfig                # → ip addr / ifconfig(Windowsのクセ)
netstat -ano            # → ss -tnp(新しいLinuxでは netstat が廃止)

# タイポ例
whcih git               # → which git
sl                      # → ls(打ち間違い)
gut status              # → git status
dokcer ps               # → docker ps

シェルが提供する候補表示

# bash:bash-completion が入っていると Tab補完で候補が出る
sudo apt install bash-completion

# zsh:デフォルトで強力な補完
# コマンド名を入力して Tab を押すと候補表示

# コマンドが曖昧な場合に似たコマンドを提案してくれる機能(zsh)
setopt CORRECT
sl
# zsh: correct 'sl' to 'ls' [nyae]? y

コマンドの正式名称を調べる

# apt search でパッケージとコマンド名を調べる
apt search "network statistics"

# man ページで関連コマンドを確認
man -k keyword          # keyword に関連するマニュアルを検索
apropos keyword         # man -k と同じ

# 例:ネットワーク関連のコマンドを調べる
man -k network | grep -i socket

パターン4:sudo 時だけ「command not found」が出る

原因:sudo はデフォルトで PATH をリセットする

# 一般ユーザーでは動く
which node
# /home/user/.nvm/versions/node/v20.0.0/bin/node
node --version
# v20.0.0

# sudo では動かない
sudo node --version
# sudo: node: command not found

sudo はセキュリティ上の理由から、デフォルトで PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin などの安全なパスにリセットします。

解決方法

方法1:フルパスで指定する(最も確実)

# which でフルパスを確認
which node
# /home/user/.nvm/versions/node/v20.0.0/bin/node

# フルパスで sudo 実行
sudo /home/user/.nvm/versions/node/v20.0.0/bin/node --version

方法2:sudo -E で環境変数を引き継ぐ

# -E オプションで現在の環境変数(PATH含む)を引き継ぐ
sudo -E node --version

# ただし sudoers の env_reset が有効だと制限される

方法3:sudo env でPATHを明示指定

sudo env PATH="$PATH" node --version

方法4:/etc/sudoers で secure_path を変更

# sudoers を安全に編集(visudo を使う)
sudo visudo
# 以下の行を探して編集
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# 必要なパスを追加
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/.nvm/versions/node/v20.0.0/bin"

# またはシステム全体の PATH を引き継ぐ(セキュリティリスクあり)
Defaults    env_keep += "PATH"

方法5:/usr/local/bin にシンボリックリンクを作る

# sudo の PATH に含まれる場所にシンボリックリンクを貼る
sudo ln -s $(which node) /usr/local/bin/node
sudo node --version  # 動くようになる

パターン5:シェルの設定ファイルが読み込まれていない

設定ファイルを変更したのに反映されない

# よくある状況
echo 'export PATH="$PATH:/usr/local/myapp/bin"' >> ~/.bashrc
myapp
# command not found  ← まだ反映されていない

# 解決:設定ファイルを再読み込み
source ~/.bashrc
# または
. ~/.bashrc

# zsh の場合
source ~/.zshrc

シェル別の設定ファイルの読み込みタイミング

bash:

ログインシェル時に読み込まれる:
  /etc/profile
  ~/.bash_profile  (なければ ~/.bash_login → ~/.profile の順)

インタラクティブシェル時に読み込まれる:
  /etc/bash.bashrc
  ~/.bashrc

ログアウト時:
  ~/.bash_logout
# ログインシェルか確認
echo $0
# -bash  ← 先頭の - がログインシェルの印
# bash   ← 通常のインタラクティブシェル

# .bash_profile から .bashrc を呼び出す(統一するため)
# ~/.bash_profile に追記
[ -f ~/.bashrc ] && source ~/.bashrc

zsh:

~/.zshenv       # 常に読み込まれる
~/.zprofile     # ログインシェル時
~/.zshrc        # インタラクティブシェル時
~/.zlogin       # ログインシェル時(zprofileの後)

fish:

~/.config/fish/config.fish    # メイン設定
~/.config/fish/conf.d/*.fish  # 追加設定
# fish での PATH 追加
fish_add_path /usr/local/myapp/bin
# ~/.config/fish/config.fish に追記することなく恒久的に設定される

SSH ログイン時に設定が読み込まれない

# SSH 非インタラクティブシェルでは .bashrc が読み込まれないことがある
ssh user@host 'echo $PATH'
# → 最小限の PATH しかない

# 解決策1:.bash_profile から .bashrc を呼び出す
# ~/.bash_profile
[ -f ~/.bashrc ] && source ~/.bashrc

# 解決策2:SSH コマンド内で明示的に読み込む
ssh user@host 'source ~/.bashrc && mycommand'

# 解決策3:~/.bashrc の先頭に以下を削除(非インタラクティブ時の早期リターンをなくす)
# 削除または変更が必要な行:
# [ -z "$PS1" ] && return  ← この行が原因のことがある

シェル別のエラーメッセージと対処

bash

bash: foo: command not found

# bash の場合、command_not_found_handle 関数でカスタマイズできる
command_not_found_handle() {
  echo "コマンド '$1' が見つかりません"
  echo "apt search $1 でパッケージを探せます"
  return 127
}

Ubuntu では command-not-found パッケージが入っていると自動的にインストール候補を提案してくれます:

sudo apt install command-not-found
sudo update-command-not-found

# 試してみる
foo
# No command 'foo' found, did you mean:
#  Command 'foo' from package 'foo' (universe)

zsh

zsh: command not found: foo

# zsh でもコマンド候補表示を有効化
# ~/.zshrc に追記
source /etc/zsh_command_not_found  # Ubuntu の場合

fish

fish: Unknown command: foo

# fish は command_not_found_handler 関数で対処
function fish_command_not_found
  echo "コマンド '$argv[1]' が見つかりません"
end

環境別のよくある原因

Docker コンテナ

# コンテナ内でコマンドが見つからない場合
# 必要なパッケージをインストール

FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
    curl \
    git \
    vim \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
# 実行中のコンテナに入って確認
docker exec -it コンテナ名 bash
which コマンド名
echo $PATH

CI/CD(GitHub Actions など)

# GitHub Actions でコマンドが見つからない場合
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y jq curl

      - name: Use jq
        run: jq --version
# PATH の追加が必要な場合
- name: Add to PATH
  run: echo "/usr/local/myapp/bin" >> $GITHUB_PATH

macOS(zsh デフォルト)

# Homebrew でインストールしたコマンドが見つからない
brew install コマンド名
コマンド名
# zsh: command not found: コマンド名

# ~/.zshrc に Homebrew の初期化を追加
eval "$(/opt/homebrew/bin/brew shellenv)"  # Apple Silicon
eval "$(/usr/local/bin/brew shellenv)"     # Intel Mac

source ~/.zshrc

Windows WSL

# Windows 側のパスが WSL の PATH に混入していることがある
echo $PATH | tr ':' '\n' | grep Windows

# Windows パスを除外(/etc/wsl.conf で設定)
sudo vi /etc/wsl.conf
[interop]
appendWindowsPath = false

デバッグの手順まとめ

「command not found」が出たときに順番に試す手順です。

# Step 1: コマンド名を確認(タイポがないか)
# ↓

# Step 2: コマンドの場所を探す
which コマンド名
whereis コマンド名
find / -name "コマンド名" -type f 2>/dev/null | head -10

# ↓ 見つかった場合
# Step 3: PATH を確認
echo $PATH | tr ':' '\n'
# フルパスで実行できるか試す
/見つかったパス/コマンド名

# ↓ フルパスで動く場合
# Step 4: PATH に追加
export PATH="$PATH:/見つかったディレクトリ"
echo 'export PATH="$PATH:/見つかったディレクトリ"' >> ~/.bashrc
source ~/.bashrc

# ↓ 見つからなかった場合
# Step 5: インストールされているか確認
dpkg -l | grep コマンド名   # Debian/Ubuntu
rpm -qa | grep コマンド名   # RHEL系

# ↓ インストールされていない場合
# Step 6: インストール
sudo apt search コマンド名  # パッケージ名を調べる
sudo apt install パッケージ名

# ↓ sudo 時だけ出る場合
# Step 7: sudo のPATHを確認
sudo env | grep PATH
sudo which コマンド名
# フルパスで sudo 実行 or /usr/local/bin にリンク

よくある質問(FAQ)

Q1. which コマンド自体が使えない場合は?

# which がない環境では type を使う(bash/zsh に組み込み)
type コマンド名

# または command -v
command -v コマンド名

# whereis は通常プリインストール済み
whereis コマンド名

Q2. インストールしたのにすぐ使えない場合は?

多くの場合、新しいシェルセッションを開くか source すれば解決します。

# 設定ファイルを再読み込み
source ~/.bashrc   # bash
source ~/.zshrc    # zsh

# それでも動かない場合は新しいターミナルを開く
# またはログアウト→ログインし直す

Q3. alias で設定したコマンドが sudo で使えない場合は?

# sudo は alias を展開しない
alias ll='ls -la'
sudo ll
# sudo: ll: command not found

# 解決策1:alias の末尾にスペースを付けると次の単語も alias として解釈
alias sudo='sudo '
sudo ll  # 動くようになる

# 解決策2:bash function を使う
ll() { ls -la "$@"; }
# ただし sudo では function も使えないため、フルパスか sudo bash -c を使う
sudo bash -c 'ls -la'

Q4. スクリプト内でコマンドが見つからない場合は?

#!/bin/bash
# スクリプト内では .bashrc が読み込まれないことがある

# 解決策1:フルパスで指定
/usr/local/bin/mycommand

# 解決策2:スクリプト内で PATH を設定
export PATH="$PATH:/usr/local/myapp/bin"
mycommand

# 解決策3:スクリプトの先頭で設定ファイルを読み込む
source ~/.bashrc  # ただし環境への依存が生まれるため注意

# スクリプト内でコマンドの存在を確認する書き方
if ! command -v jq &>/dev/null; then
  echo "jq がインストールされていません"
  exit 1
fi

Q5. python コマンドが使えず python3 しかない場合は?

# python3 が python として呼べるようにする
sudo apt install python-is-python3  # Ubuntu
# または
sudo ln -s /usr/bin/python3 /usr/local/bin/python

# update-alternatives で管理する
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
python --version

Q6. pip が見つからない場合は?

# pip3 を使う
pip3 install パッケージ名

# または pip を pip3 として設定
sudo apt install python3-pip
python3 -m pip install パッケージ名

# pip が python3 を指すようにする
sudo ln -s /usr/bin/pip3 /usr/local/bin/pip

Q7. 存在するコマンドが急に動かなくなった場合は?

# PATH が壊れていないか確認(完全に空になっている場合など)
echo $PATH

# PATH が壊れている場合はデフォルト値でリセット
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# .bashrc / .zshrc の構文エラーを確認
bash -n ~/.bashrc
zsh -n ~/.zshrc

# 直前の変更を元に戻す
# ~/.bashrc をエディタで開いて最近追加した行を確認・削除

まとめ

「command not found」が出たときは以下の順で確認します。

1. タイポがないか確認 2. which / whereis でコマンドの場所を探す 3. 見つかれば PATH に追加(~/.bashrc~/.zshrc 4. 見つからなければ apt install / dnf install でインストール 5. sudo 時だけ出るならフルパス指定か /usr/local/bin にリンク 6. 設定を変えたら source ~/.bashrc で反映

# 困ったときの基本コマンド
which コマンド名          # どこにあるか
type コマンド名           # シェルがどう解釈するか
echo $PATH               # PATH の確認
apt search コマンド名     # パッケージを探す(Ubuntu/Debian)
dnf provides コマンド名   # パッケージを探す(RHEL系)

原因のほとんどは「インストールされていない」か「PATH が通っていない」の2つです。落ち着いて順番に確認すれば必ず解決できます。


参考リンク

公式ドキュメント

関連記事(本サイト)


本記事は2026年6月時点の情報をもとに、Ubuntu 24.04 LTS・bash 5.2・zsh 5.9 での動作確認に基づき作成しています。ディストリビューションやバージョンによって挙動が異なる場合があるため、最新情報は各公式ドキュメントをご確認ください。