Lv2 では、権限や apt、grep、パイプ(=半角の縦棒 | で、前のコマンドの結果を次のコマンドに渡すこと)など、Linux を使いこなすための基本をひととおり見てきました。apt は、Debian・Ubuntu で、ソフトを入れる・更新する・消すための道具でしたね。ここからの Lv3 では、いよいよ「自動化」に近づいていきます。
その最初の壁が、command not found です。ネットの手順どおりにソフトを入れたのに、コマンドを打つと「そんなコマンドはない」と言われる。よくあるのが、自分で作ったスクリプトを置いたのに動かない、というパターンです。私も最初は、こういうところで時間を溶かしがちでした。原因の多くは、PATH という「コマンドを探す場所のリスト」に、その場所が入っていないことです。
この記事では、環境変数と PATH のしくみ、そして .bashrc と alias でターミナルを自分好みに整える方法を、練習用のファイルで確かめながら見ていきます。
- 環境変数とは何か(
$HOME・$USER・$PATH) - 「command not found」が出るしくみと、PATH に場所を足す方法
-
exportをつける・つけないの違い -
.bashrcに書いて、設定を毎回使えるようにする方法 -
aliasで、長いコマンドに短い名前をつける方法
-
chmod u+xでファイルに実行権限をつけられる -
nanoでファイルを編集・保存できる -
>と>>の違いがわかる
まだの方は、前の記事「Linuxの圧縮と展開|tar・gzip・zipの使い分け【初心者向け】」と、Lv2 の記事から読むのがおすすめです。
- 権限(パーミッション):ファイルを「持ち主・グループ(ユーザーをまとめたチーム)・その他の人」ごとに、読む・書く・実行するをしてよいかの決まり
- フルパス:
/home/kaito/linux-practice/bin/hello-kaitoのように、いちばん上の/から書いた場所(絶対パスとも言います) - ログインシェル:ログインしたときに最初に動くシェル。エラーの頭につく
-bash:の-が、その印です - APIキー・トークン:Web のサービスを使うときに、本人の代わりになる合言葉のような文字列。人に見せてはいけません
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:コマンドは「PATH に書かれた場所」からしか探されない
| 用語 | ひとことで言うと | 確かめ方 |
|---|---|---|
| 環境変数 | シェルが覚えていて、動かすプログラムにも渡す「名前つきのメモ」 | printenv |
$HOME | 自分のホームディレクトリの場所 | echo $HOME |
$PATH | コマンドを探しに行く場所のリスト | echo $PATH |
export | メモを、そのあと動かすプログラムにも渡す | export 名前=値 |
.bashrc | ターミナルを開くたびに読まれる設定ファイル | nano ~/.bashrc |
alias | コマンドのあだ名 | alias ll='ls -alF' |
環境変数をのぞいてみる
環境変数は、シェルが覚えていて、そこから動かすプログラムにも渡される「名前つきのメモ」です。名前の前に $ をつけると、中身を取り出せます。
- 1
- 2
- 3
echo $HOME
echo $USER
echo $SHELLここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
- 2
- 3
- 4
- 5
- 6
kaito@demo:~$ echo $HOME
/home/kaito
kaito@demo:~$ echo $USER
kaito
kaito@demo:~$ echo $SHELL
/bin/bashほかにどんなメモがあるかは、printenv で一覧できます。とても長いので、head で先頭だけ見てみましょう。
- 1
printenv | head -15(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
kaito@demo:~$ printenv | head -15
SHELL=/bin/bash
PWD=/home/kaito
LOGNAME=kaito
HOME=/home/kaito
LANG=C.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.7z=01;31:*.ace=01;31:*.alz=01;31:*.apk=01;31:*.arc=01;31:*.arj=01;31:*.bz=01;31:*.bz2=01;31:*.cab=01;31:*.cpio=01;31:*.crate=01;31:*.deb=01;31:*.drpm=01;31:*.dwm=01;31:*.dz=01;31:*.ear=01;31:*.egg=01;31:*.esd=01;31:*.gz=01;31:*.jar=01;31:*.lha=01;31:*.lrz=01;31:*.lz=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.lzo=01;31:*.pyz=01;31:*.rar=01;31:*.rpm=01;31:*.rz=01;31:*.sar=01;31:*.swm=01;31:*.t7z=01;31:*.tar=01;31:*.taz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tgz=01;31:*.tlz=01;31:*.txz=01;31:*.tz=01;31:*.tzo=01;31:*.tzst=01;31:*.udeb=01;31:*.war=01;31:*.whl=01;31:*.wim=01;31:*.xz=01;31:*.z=01;31:*.zip=01;31:*.zoo=01;31:*.zst=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.jxl=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:
TERM=xterm-256color
USER=kaito
SHLVL=1
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
MAIL=/var/mail/kaito
_=/usr/bin/printenvLS_COLORS は ls の色分けの設定で、1行がとても長く表示されます。読み飛ばして大丈夫です。
自動化を進めていくと、API キーやトークンを環境変数に入れることがあります。そうなると、printenv の一覧に、それらがそのまま表示されます。スクリーンショットや質問に貼る前に、必ず中身を見直しましょう。
PATH:コマンドを探す場所のリスト
いちばん大事な環境変数が PATH です。中身を見てみます。
- 1
echo $PATH(例)
- 1
- 2
kaito@demo:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesUbuntu や WSL では、/usr/local/sbin などの場所が加わって、もっと長く表示されることがあります。
:(コロン)で区切られた場所が、コマンドを探しに行くリストです。たとえば ls と打つと、シェルはこのリストを左から順番にのぞいて、ls という名前のファイルを探します。見つかった場所を確かめるには、Lv2 で使った which が便利です。
- 1
- 2
which ls
which nano(例)
- 1
- 2
- 3
- 4
kaito@demo:~$ which ls
/usr/bin/ls
kaito@demo:~$ which nano
/usr/bin/nano「command not found」を自分で起こしてみる
練習用に、小さなコマンドを自分で作ってみます。場所は ~/linux-practice/bin です。
- 1
- 2
- 3
- 4
- 5
mkdir -p ~/linux-practice/bin
cd ~/linux-practice/bin
echo 'echo "kaito のコマンドが動きました"' > hello-kaito
chmod u+x hello-kaito
ls -l hello-kaito(例)
- 1
- 2
kaito@demo:~/linux-practice/bin$ ls -l hello-kaito
-rwxrw-r-- 1 kaito kaito 47 Nov 1 02:53 hello-kaito持ち主のところ(左から2〜4文字目)に x がついていれば大丈夫です。グループのところが rw- になっているのは、新しく作るファイルの権限の初期設定(umask)によるもので、環境によっては -rwxr--r-- と表示されます。
その場所にいる状態で、名前だけで呼んでみましょう。
- 1
hello-kaito(例)
- 1
- 2
kaito@demo:~/linux-practice/bin$ hello-kaito
-bash: hello-kaito: command not found先頭の -bash: は、ログインシェルで動いているときの表示です。ふだんのターミナルでは bash: hello-kaito: command not found のように表示されることもあります。日本語の環境では -bash: hello-kaito: コマンドが見つかりません と表示されます。
ファイルは目の前にあるのに、「見つからない」と言われました。シェルは、今いる場所ではなく、PATH に書かれた場所だけを探すからです。場所をつけて呼べば動きます。
- 1
- 2
./hello-kaito
~/linux-practice/bin/hello-kaito(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/bin$ ./hello-kaito
kaito のコマンドが動きました
kaito@demo:~/linux-practice/bin$ ~/linux-practice/bin/hello-kaito
kaito のコマンドが動きましたPATH に場所を足す
毎回場所を書くのは面倒なので、PATH のリストに ~/linux-practice/bin を足してみます。
- 1
- 2
- 3
- 4
- 5
export PATH="$HOME/linux-practice/bin:$PATH"
echo $PATH
cd ~
hello-kaito
which hello-kaito(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
kaito@demo:~/linux-practice/bin$ export PATH="$HOME/linux-practice/bin:$PATH"
kaito@demo:~/linux-practice/bin$ echo $PATH
/home/kaito/linux-practice/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
kaito@demo:~/linux-practice/bin$ cd ~
kaito@demo:~$ hello-kaito
kaito のコマンドが動きました
kaito@demo:~$ which hello-kaito
/home/kaito/linux-practice/bin/hello-kaitoホームに戻っても、名前だけで動くようになりました。ポイントは、最後の :$PATH です。「新しい場所+今までのリスト」という意味で、今までの場所を残したまま先頭に足しています。
ここで ~/linux-practice/bin ではなく $HOME/linux-practice/bin と書いているのには、理由があります。" で囲んだ中では、~ はホームの場所に置きかわらず、~ という文字のまま残ってしまうからです。$HOME なら、" の中でも /home/kaito に置きかわります。
先頭に足したので、同じ名前のコマンドがほかの場所にもあるときは、先頭に足した場所のものが先に見つかります。PATH="$PATH:足す場所" のように後ろに足すと、今までのコマンドが優先されます。練習では、どちらでも動きます。
export PATH="$HOME/linux-practice/bin" のように :$PATH を書き忘れると、PATH が「その1か所だけ」に置きかわります。すると、ls も nano も見つからなくなり、ほとんどのコマンドが「command not found」になります。ターミナルを開き直せば元に戻りますが、これを .bashrc に書いてしまうと、開き直しても同じ状態が続いてしまいます。この記事では試しません。PATH を書きかえるときは、必ず :$PATH がついているか見直しましょう。
- 名前のつづり:大文字・小文字もふくめて、まちがっていないか
- 入っているか:
ls 置いた場所でファイルがあるか。ソフトならsudo apt installで入れたか - PATH に場所があるか:
echo $PATHに、そのファイルを置いた場所が入っているか - 場所つきなら動くか:
./名前やフルパスで動けば、PATH の問題です。Permission deniedなら、実行権限(x)の問題です
which 名前 が何も表示しないときは、PATH のどこにも見つからなかった、という意味です。似た道具に type 名前 があり、こちらは alias やシェルに組み込まれたコマンド(cd など)も教えてくれます。
export をつける・つけないの違い
メモは自分で作ることもできます。export をつけないで作ったメモはシェル変数と呼ばれ、今のシェルの中だけで使えます。export をつけたものが環境変数で、そこから動かすプログラムにも渡されます。
- 1
- 2
- 3
MY_MESSAGE="こんにちは"
echo $MY_MESSAGE
bash -c 'echo "子どものシェル:$MY_MESSAGE"'(例)
- 1
- 2
- 3
- 4
- 5
kaito@demo:~$ MY_MESSAGE="こんにちは"
kaito@demo:~$ echo $MY_MESSAGE
こんにちは
kaito@demo:~$ bash -c 'echo "子どものシェル:$MY_MESSAGE"'
子どものシェル:bash -c は、新しいシェル(子ども)を1つ動かして、その中でコマンドを実行します。export をつけると、子どもにもメモが渡ります。
- 1
- 2
export MY_MESSAGE="こんにちは"
bash -c 'echo "子どものシェル:$MY_MESSAGE"'(例)
- 1
- 2
- 3
kaito@demo:~$ export MY_MESSAGE="こんにちは"
kaito@demo:~$ bash -c 'echo "子どものシェル:$MY_MESSAGE"'
子どものシェル:こんにちはPython のスクリプトや、次の記事で作るシェルスクリプトに値を渡したいときは、export が必要です。
ターミナルを閉じると消える
ここで一度ターミナルを閉じて、新しく開き直してください(WSL ならウィンドウを閉じて開き直し)。そして、さっきのコマンドを打ってみます。
- 1
- 2
echo $MY_MESSAGE
hello-kaito(例)
- 1
- 2
- 3
- 4
kaito@demo:~$ echo $MY_MESSAGE
kaito@demo:~$ hello-kaito
-bash: hello-kaito: command not foundecho $MY_MESSAGE は、何も表示されずに空の行になりました。
export で作った設定は、そのターミナルを閉じると消えてしまいます。毎回使いたい設定は、次の .bashrc に書いておきます。
.bashrc に書いて、毎回使えるようにする
~/.bashrc は、ターミナルを開くたびに自動で読まれる設定ファイルです。名前が . で始まるので、ふつうの ls では見えません。まず、必ずコピーを取ってから編集します。
- 1
- 2
- 3
- 4
cd ~
ls -a | grep bashrc
cp ~/.bashrc ~/.bashrc.bak
ls -l ~/.bashrc ~/.bashrc.bak(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
kaito@demo:~$ cd ~
kaito@demo:~$ ls -a | grep bashrc
.bashrc
kaito@demo:~$ cp ~/.bashrc ~/.bashrc.bak
kaito@demo:~$ ls -l ~/.bashrc ~/.bashrc.bak
-rw-r--r-- 1 kaito kaito 3526 Nov 1 02:41 /home/kaito/.bashrc
-rw-r--r-- 1 kaito kaito 3526 Nov 1 02:53 /home/kaito/.bashrc.baknano で開いて、いちばん下に次の2行を書き足し、保存して閉じます(Ctrl + O → Enter → Ctrl + X)。
- 1
nano ~/.bashrc書き足す2行:
- 1
- 2
# 練習用:自分のコマンド置き場を PATH に足す
export PATH="$HOME/linux-practice/bin:$PATH"保存したら、tail で書き足せたか確かめて、source で読み直します。
- 1
- 2
- 3
tail -3 ~/.bashrc
source ~/.bashrc
hello-kaito(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
kaito@demo:~$ tail -3 ~/.bashrc
fi
# 練習用:自分のコマンド置き場を PATH に足す
export PATH="$HOME/linux-practice/bin:$PATH"
kaito@demo:~$ source ~/.bashrc
kaito@demo:~$ hello-kaito
kaito のコマンドが動きましたsource は「今のシェルで、このファイルを読み直して」という意味です。ターミナルを開き直しても、今度は hello-kaito が動くはずです。
書き間違えて、ターミナルを開くたびにエラーが出るようになったら、cp ~/.bashrc.bak ~/.bashrc で元に戻せます。.bashrc にはもともと大事な設定が書かれているので、> で書き込んで中身を消さないように、編集は nano で行うのがおすすめです。
alias:コマンドにあだ名をつける
よく使う長いコマンドには、alias で短いあだ名をつけられます。
- 1
- 2
- 3
alias ll='ls -alF'
ll ~/linux-practice
type ll(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
kaito@demo:~$ alias ll='ls -alF'
kaito@demo:~$ ll ~/linux-practice
total 44
drwxrwxr-x 11 kaito kaito 4096 Nov 1 02:53 ./
drwx------ 4 kaito kaito 4096 Nov 1 02:54 ../
drwxrwxr-x 5 kaito kaito 4096 Nov 1 02:12 archive-test/
drwxrwxr-x 2 kaito kaito 4096 Nov 1 02:53 bin/
drwxrwxr-x 2 kaito kaito 4096 Nov 1 02:09 chmod-test/
drwxrwxr-x 2 kaito kaito 4096 Nov 1 02:34 edit-test/
drwxrwxr-x 5 kaito kaito 4096 Nov 1 02:10 find-test/
drwxrwxr-x 3 kaito kaito 4096 Nov 1 02:10 grep-test/
drwxrwxr-x 2 kaito kaito 4096 Nov 1 02:08 link-test/
drwxrwxr-x 3 kaito kaito 4096 Nov 1 02:08 perm-test/
drwxrwxr-x 2 kaito kaito 4096 Nov 1 02:11 redirect-test/
kaito@demo:~$ type ll
ll is aliased to `ls -alF'今設定されている alias の一覧は、alias だけで見られます。
- 1
alias(例)
- 1
- 2
- 3
kaito@demo:~$ alias
alias ll='ls -alF'
alias ls='ls --color=auto'Debian 13 の初期設定で入っていた alias は、ls に色をつける alias ls='ls --color=auto' だけでした。
あだ名を外すときは unalias です。
- 1
- 2
unalias ll
ll(例)
- 1
- 2
- 3
kaito@demo:~$ unalias ll
kaito@demo:~$ ll
-bash: ll: command not found日本語の環境では -bash: ll: コマンドが見つかりません と表示されます。
alias も、.bashrc に書いておけば毎回使えます。Debian の .bashrc には、ll・la・l の3つが、#alias ll='ls -l' のように先頭に # がついた見本として入っています(# がついているので、そのままでは使えません)。# を消すだけで使えるようになるので、nano で探してみてください。
alias rm='rm -rf' や alias cd='…' のように、もとからあるコマンドの名前を上書きする alias は、思わぬ削除や混乱のもとになります。特に、ネットで見つけた .bashrc の設定を中身を読まずにまるごと貼るのは危険です。この記事では試しません。あだ名は ll のように、もとからない名前でつけましょう。
後片づけ:練習の設定を戻す
練習で足した PATH の行は、このあとの記事でも使えますが、元に戻したい場合はコピーから戻します。
- 1
- 2
- 3
cp ~/.bashrc.bak ~/.bashrc
source ~/.bashrc
tail -3 ~/.bashrc(例)
- 1
- 2
- 3
- 4
- 5
- 6
kaito@demo:~$ cp ~/.bashrc.bak ~/.bashrc
kaito@demo:~$ source ~/.bashrc
kaito@demo:~$ tail -3 ~/.bashrc
. /etc/bash_completion
fi
fiただし、source しても、今のターミナルの PATH には練習の場所が残っています。ターミナルを開き直すと、すっきり元どおりになります。
🤖 詰まったらAIに聞こう:「command not found」が直らない
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Linuxの初心者です。コマンドを打つと「command not found」と出ます。
原因として考えられることと、確かめる順番を教えてください。
PATH を直す必要がある場合は、今の設定を消さない書き方でお願いします。
【使っている環境】WSLのUbuntu など
【打ったコマンド】ここに貼る
【表示されたエラー】ここに貼る
【which の結果】ここに貼る
【echo $PATH の結果】ここに貼る
【.bashrc に自分で書き足した行(秘密情報は***に置き換え済み)】ここに貼るprintenv の結果や .bashrc には、APIキー、トークン、パスワードを入れた行がまざっていることがあります。export OPENAI_API_KEY=… のような行は、キーの部分を必ず「***」に置き換えてから貼ってください。.bashrc をまるごと貼るのではなく、関係する行だけを選んで貼るのがおすすめです。
よくある質問
Q. コマンドを別のフォルダに移したら、No such file or directory と出るようになりました。
bash は、一度見つけたコマンドの場所を覚えておくしくみ(ハッシュ)を持っています。前の場所を覚えたままだと、移したあとも古い場所を探しにいってしまいます。hash -r と打って覚えている場所を消すか、ターミナルを開き直すと、PATH から探し直してくれます。
Q. pipx などで入れたコマンドが「command not found」になります。
pipx は、Python のコマンドを入れる道具です。こうした道具は、コマンドをホームの中の ~/.local/bin に置くことが多いです。Debian や Ubuntu では、~/.local/bin があればログインしたときに PATH へ足す設定が、最初から ~/.profile に書かれています。フォルダができたあとに一度ログインし直す(WSL ならウィンドウを全部閉じて開き直す)と、見つかるようになることがあります。
Q. .bashrc と .profile は、どう違うのですか?
.profile はログインしたときに1回読まれるファイル、.bashrc は bash を開くたびに読まれるファイルです。Debian や Ubuntu では、.profile の中から .bashrc も読むように書かれているので、初心者のうちは「自分の設定は .bashrc に書く」と覚えておけば大丈夫です。
Q. sudo をつけると、自分で足した場所のコマンドが見つかりません。
sudo は、許可されたユーザーが、そのコマンドだけを管理者(root)の権限で動かすためのしくみです。安全のために、決まった PATH(/usr/bin など)でコマンドを探して動かします。そのため、~/linux-practice/bin のように自分で足した場所は探されません。sudo で動かす必要があるときは、sudo /home/kaito/linux-practice/bin/hello-kaito のように、場所つきで書きます。
まとめ
- 環境変数は、シェルが覚えていて、動かすプログラムにも渡す名前つきのメモ。
$名前で取り出す - コマンドは、PATH に書かれた場所からしか探されない。今いる場所は探さない
- PATH に足すときは
export PATH="足す場所:$PATH"。:$PATHを忘れない -
exportをつけると、そのあと動かすプログラムにも値が渡る - 毎回使う設定は
~/.bashrcに書き、sourceで読み直す。編集の前にコピーを取る -
aliasでコマンドにあだ名をつけられる。もとからある名前は使わない
次の記事では、いつもの手順を1つのファイルにまとめるシェルスクリプトを作ります。今回の ~/linux-practice/bin のしくみが、そのまま役に立ちます。
次に読む記事
関連する記事
- Python入門|環境構築と最初の1本を動かす:python3 が「command not found」になったときの確かめ方を知りたい方に
- Cursorにエラーを直してもらう5ステップ|エラーの渡し方・頼み方・直った後の確認まで:エラーを AI に渡すときのコツを知りたい方に
- 自動化スタック総覧|GAS・n8n・Python・Notionの使い分け:API キーを使う自動化の全体像を知りたい方に