叉焼.log

札幌のこととか、ITの事とか

何故かcommand not found が出るときの対処法

こんにちは。札幌は随分あったかくなってきた。でも手元のラズパイは俺に冷たい。そう、あるコマンドを実行すると「command not found」しか話してくれなくなった。うおーー何故じゃ!PATHも正しいのに何故じゃ!!!と思ってサークルの先輩に聞くとマッハで答えが返ってきたのでメモ

まず、PATHは通ってるよね・・・?

$PATHというのは環境変数の一つ。コマンドを入力すると$PATHで指定したディレクトリの中からコマンドと同じ名前の実行ファイルを検索して持ってきてくれる。
つまり、本来なら長ったらしく実行ファイル(コマンド)のフルパスを書かなくてはいけないところを、$PATHにパスの途中まで記述しておくことで手間を省いているのだ。例えば、「日本の北海道にある北海道大学」などと言わなくても$PATHに「日本の北海道」を登録しておけば「北海道大学」だけで話が通じるのと同じである。(頭の中に$PATHがあるんです)

まずはwhereisコマンドで「command not found」を出しまくるコマンドのパスを調べる。

$whereis hoge
/usr/local/foo/hoge

$PATHには実行ファイルのあるディレクトリを指定するので、この場合は/usr/local/fooが登録されているか確認する。
それではPATHを出力してみる。

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

コロンで区切られたパスが複数登録されているのがわかる。

$PATHにさっきの/usr/local/fooがねえ!!という方

PATHを登録しよう。~/.bashrcをエディタで開き、以下を追記する。

export PATH=$PATH:/usr/local/foo

保存して、更新する。

$source .bashrc

もう一度$PATHを出力してみて最後に/usr/local/fooが追加されていたらおK

$PATHにさっきの/usr/local/fooがあるじゃねえか!!という方

はい。私です。私でした。

ぼくLine「かくかくしかじかで〜困ってるんですよぅ(涙目)」
5秒後
先輩Line「ああ、それね。実行するときsudo付きだからだよ」
ぼく「速いッ!?」

今朝の出来事だった。そう、linux初心者の私はsudo付きでコマンド実行するときに$PATHがスーパーユーザーのものに変わることに気がつかなかったのだ。
各ユーザ毎に$PATHは異なるので、sudo付きで実行するコマンドは一般ユーザの$PATHに登録していても意味がない。

では、sudo付きでも一般ユーザの$PATHを使えるようにしよう。
まずvisudoコマンドを使う。

$sudo visudo

テキストファイルが開くので

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification
...

これを

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
#Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        env_keep +="PATH"
# Host alias specification
...

こうする。
アハ体験だと思ってどこが変わったか自分で探すこと。嘘ですごめんなさい説明します。と言っても簡単で、secure_pathの部分をコメントアウトし、Defaults env_keep +="PATH"を追加するだけだ。

さあこれでsudo付きでもnot foundなんて吐かれないはずである。
これでも吐かれるという不憫な方は
UNIXの部屋 コマンド検索:Command not found (*BSD/Linux)
こちらを参照。


参考にさせていただいた記事
sudo時にPATHを引き継ぐ方法 - Qiita