またはVSCodeを起動したらGitが見つからないと言われる→Gitのコマンドが打てない→むしろあらゆるターミナルのコマンドが効かない→PATHを誤って編集していた件
***
〜始まりの日:エラーとの出会い〜
ある日、Visual Studio Code (テキストエディタ:以下VSCode) を起動したら
Git not found. Install it or configure it using the ‘git.path’ setting.
という見慣れないエラーメッセージが画面右下にポップアップしてくる。
要するに「Gitが見つかりません。Gitをインストールするか ‘git.path’ を使うよう環境設定をしてください」ということらしいが、昨日まで普通にコーディングしていて、GitやGithubも使えていたのにこれは一体どういうことか。
VSCodeのTerminalでgitコマンドを打ってみる。何でもいいけど、まずは試しに
git branch
すると
bash: git: command not found
と返ってくる。Gitのコマンドが見つからないらしい。
当方の環境は以下の通り。
- Mac OS Mojave (バージョン 10.14.3)
- MacBook Pro (Retina, 13-inch, Early 2015)
- Visual Studio Code: Version 1.37.1
- git version 2.20.1 (Apple Git-117)
- Gitのパス: /usr/bin/git
〜冒険その1:VSCodeのgit.pathを確認〜
Gitコマンドが見つからないとは言うもののGitはインストール済みなので、エラーのアドバイスに従い git.path を編集してみる。
VSCodeのメニュー Code > Preferences > Settings (または “Command” + “,” のキーボードショートカット)で環境設定の画面を開く。
Search settingsのテキスト入力欄に git.path と入力すると候補の一番上に設定ファイルへのリンクが出てくるので、Edit in settings.json をクリックしてJSONファイルを開く。
JSONファイルに、自分は下記の1行を追加。
Gitのインストール先は人それぞれ違う可能性があるので、パスの内容は要確認。
"git.path" : "/usr/bin/git"
すでに他に追加済みの項目がある場合は、カンマ(,)で区切るのを忘れずに。
保存してVSCodeを再起動してみると、”Git not found. Install it or configure it using the ‘git.path’ setting.” のポップアップは無くなった。
しかしgitのコマンドが効かないのは相変わらず。
VSCodeではなく、通常のターミナルからgitコマンドを打ち込んでも変わらず。
というかここで気付いた。gitどころか、lsやcomposerなど他のコマンドも効かない。これは一体。
それで思い出したのだが、React Nativeの環境構築か何かをしているときに
nano ~/.bash_profile
のコマンドで ~/.bash_profile 内のパスの設定を編集しており、その際に誤って既存の情報を削除なりしてしまったか・・・というのが一番真実に近そうな仮説だった。
(ちなみにnanoはターミナルなどのコマンドラインで利用できるテキストエディタで、Linux系では標準装備となっている。)
〜冒険その2:コマンドを一時復活させる呪文〜
次に見つけたのが、「コマンドがnot found祭りでも、ターミナルでとりあえずこれを打てば復活します」というもの。
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
やってみた。確かに復活した。
でもターミナルを再起動したら、またコマンドを受けつけなくなった。
このコマンドだと設定は保存されていないらしい。
そして設定を保存するには、~/.bash_profile なりを編集する必要があるらしい。
なるほどだんだん分かってきた。
〜閑話休題:~/.bash_profile と環境変数、そして「パスを通す」とは〜
既に何度か出てきている ~/.bash_profile だが、実は .bash_profile は初期状態のMacにはだいたい存在しない。
~/はパソコンのホームディレクトリを示し、.(ドット)は隠しファイルを意味し、bash_profile のファイル内では環境変数を定義できる。
少し言い換えると、ホームディレクトリに置いてある bash_profile という名前の隠しファイルは、パス=PATHの設定(環境変数)等を保存しておくのに使い、必要に応じて自分で新規作成して使う。
通常、パス(PATH)とはフォルダやファイルの場所を示し、例えばアプリケーションを使いたいときにはパスさえ指定すれば起動できる。
しかしアプリケーション(実行ファイル)がとても深い階層にある場合、いちいち呼び出しの際に user/example/somewhere/Applications/app… と指示を出すのは大変なので、ショートカットするように app とだけ書けば実行してくれるようにするのが、環境変数の設定=PATHを通す、ということの意味である。
環境変数の中身はいろいろあるが、今回に関しては言ってしまえば、フォルダやファイルのフルパスを格納したものということになる。
そしてPATH変数の少し厄介なところが、いろいろなアプリケーションなりパッケージをインストールする際に、訳も分からず環境構築をしたり ~/.bash_profile を編集したりして結果、PATHが上書きされることが多いということである。
例えば ~/.bash_profile のファイルは初期状態のMacには存在しないので、ファイルなりファイルの中身なりを削除すれば初期状態のMacが持つ元々の環境変数を見ることができる。(~/.bash_profile 以外のファイルでも環境変数を上書きしている可能性はあるが、今回はいったん ~/.bash_profile を例にとる。)
すべての環境変数を見たい場合は下記のコマンドを打つ。
printenv
以下のコマンドを打つと、PATH変数の中身だけが出てくる。
echo $PATH
自分の場合、初期状態のPATHの内容は以下の通りだった。
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
簡単に説明すると、: はフォルダ(ディレクトリ)の区切りを示し、$PATH という変数の中に、以下6つのディレクトリが定義されていると考えれば良い。
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /opt/X11/bin
/usr/local/bin: /usr/bin: /bin: /usr/sbin: /sbin: /opt/X11/bin を例にとると左側ほど優先度が高く、ls など何らかのコマンドを打った場合は、左側のフォルダ群から中身を探しに行って実行ファイルを実行する。最初に /usr/local/bin を見に行って ls が無いか探す→見つからなかったら /usr/bin を見に行く→最後のディレクトリまで行ってもコマンドが見つからなければ、 command not found とエラーが返ってくる。
また、PATHは変数なのでその名の通り値を変更することができるし、デフォルトのパスを保持したまま値を変更するということもできる。
少しプログラミングをかじったことのある人なら変数の定義や振る舞いはイメージがつきやすいと思うが、方法は簡単で、例えば PATH = xxx という内容で定義されたパスを保持したまま新しくyyyにパスを通したい(PATH変数にyyyという値を追加したい)ということであれば、PATH = yyy:$PATH のようにしてあげれば、PATH = yyy:xxx という意味になるため元々の設定を継承しながら新しくパスを通せるということになる。このとき再代入する$PATHを新しいパスの前に持ってくるか後ろに持ってくるかももちろん重要で、新しく通すパスの方を優先させたいのであれば、既存のパス $PATH は後ろに書いてあげる必要がある。
今回の自分のエラーに立ち返ってみると、Macがデフォルトで持っている環境変数を上書きしないか、元々のものを継承した上で上書きするのであればエラーは起こらないはずだった。しかし自分の ~/.bash_profile をよく見てみると、デフォルトのPATH変数を完全になかったことにするような上書きのされ具合だったので、これは自戒として書いておきたいと思う。
〜冒険その3:隠しファイルを表示させてテキストエディタで編集する〜
最後に、 ~/.bash_profile を、AtomでもVSCodeでもよくあるコーディング用のテキストエディタで開いて、コマンドを復活させようと思う。
本当はvimで編集するのが早いけど、隠しファイルを含めたファイル構成をFinderで確認しながら普通のテキストエディタで編集してみたいと思ったので挑戦。
Finderでは基本 .bash_profile などの隠しファイルを表示してくれないので、下記を参考に隠しファイルを可視化することに。
(隠しファイルにはだいたい超重要な設定が書いてあるため、誤って編集されないように、普段は見えないようになっている。)
ただし今のままだと、参考URLにある隠しファイルを表示させる系のコマンドも使えないので、いったん
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
を打ってもう一度コマンドを使えるようにしてあげて、その後、隠しファイルを表示させるコマンド実行。
defaults write com.apple.finder AppleShowAllFiles TRUE
そしてそれを反映させるためにFinderを終了。
killall Finder
これで隠しファイルが見えるようになっているので、Finderのホームディレクトリから .bash_profile を探し、普通のテキストエディタで開く。
自分の ~/.bash_profile は以下のようになっていた。
export PATH export PATH=$HOME/.nodebrew/current/bin:$PATH export PATH=~/.composer/vendor/bin
ここまで読んでくれた方ならお気づきだと思うが、2行目ではきちんと既存のPATHを継承している(行末に$PATHを入れている)のに対して、次の行ではそれを行わずに、完全なる新規のPATHとして追加しているのがわかる。これが今回のエラーの原因である。
というわけで、最後の行を以下のように修正。(ホームディレクトリの指定も ~/ と $HOME で表記ブレが気持ち悪かったので $HOME に統一しておいた。)
export PATH=$HOME/.composer/vendor/bin:$PATH
この段階ではまだコマンドは復活していないが、ターミナルでさらに
source ~/.bash_profile
と打ってあげれば、設定が再読み込みされて反映される=ターミナルでコマンドが使えるようになる・・・!!
sourceコマンドを実行しなかったために設定が反映されず、右往左往したのも今では良い思い出。
もしくはターミナル再起動でも同じ効果が得られる。
なおFinderの隠しファイルは [command] + [shift] + [.(ドット)] のキーボードショートカットで、表示・非表示の切り替えが可能。
〜後日譚1:vimで ~/.bash_profile を編集するには〜
nano以外の、vi/vim (コマンドラインから利用できるテキストエディタ) で編集する場合は下記のコマンドを実行。
vi ~/.bash_profile
ただ、ターミナルでコマンドが効かない(パスが通っていない)状態だと、この vi も実行できない。
vimの画面では i や a のキー押下で INSERT というテキスト編集モードになり、escキーでvimの元の(編集できない)画面に戻る。vimを閉じてターミナルに戻りたいときは、escでvimの通常画面に戻った上で、下記をタイプしてエンター。
- :q → vimを終了(ターミナルに戻る)
- :q! → vimを保存せず終了
- :wq → vimでの編集を上書き保存して終了
〜後日譚2:コマンドラインから直接ファイルへの追記を行うには〜
vimで開かなくても、ファイル内の末尾に何か1行追記するだけであれば、
echo export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin >> ~/.bash_profile
のように、echo 追記したい内容 >> 追記先のファイル としてあげればOK。
ただこちらも、コマンドが効かない(パスが通っていない)状態だと実行できない。また1行丸ごとを追加するので、既存の行末への追加はできないことも注意。
> の大なり記号の数を間違える(> ひとつだけにしてしまう)と、元々の内容はすべて消され、新しく書いたものだけで上書きされてしまうので、それも注意。
いやはや、長い旅だった。
(2019.08.27 環境変数に関する記述を追加、修正)
その他の参考URL
Vim/Viの終了のさせ方
vimの基本操作
VSCodeとGit連携がうまくいかない
MacOSをアップデートしたらGitでエラーが発生した
High Sierraへアップデート後のgitエラー
GitをMacに導入するなど
Git のインストール 〜Git をMacにインストールしよう〜
MacでVisual Studio CodeをインストールしGit連携するまでの手順
[OS X] ターミナルでのテキスト編集にはnanoが便利
Macでもnanoエディタが便利
nano エディタの使い方
“nano”を終了する
MacのTerminalの環境変数をブッ壊したときの対処法
PATHを通すために環境変数の設定を理解する (Mac OS X)
PATHを通すとは? (Mac OS X)
「PATH を通す」の意味をできるだけわかりやすく説明する試み
PATH設定がどこにあるか分からないときに見るべきファイル
.bash_profileと.bashrcについて
MacでPATHを通す .bash_profileの作成と編集
[Mac]環境変数PATHの設定・変更・追加・確認・順番入れ替えの方法
ターミナルの設定ファイルを作る[.bash_profile]
Macターミナルの初期設定では~/.bash_profileと~/.bashrcはない?
.bash_profileと.bashrcなんて使い分けなくてよかったんや!
.bash_profileが見当たりません。
“.”で始まるファイルは「隠しファイル」
GNU nanoを使いこなす
Laravel PHPコマンドが見つかりません
Macターミナルでエイリアスを設定する方法
面倒なシェルコマンドはaliasにしてしまえ!
ターミナルのよく使うコマンド
Linux,Unixのターミナルでのテキスト編集コマンド
【mac terminal bash】環境変数がターミナル再起動後に消える
【初心者でもOK!】$PATHを理解するためのMacの環境変数について
【初心者でもOK!】Macのパス($PATH)を理解する
読めばわかるMACでのPATH設定を完全理解
Mac でパスを通す: 意味とパスの通し方
macの環境変数のPATH
この記事へのコメントはありません。