python入門講座 | Visual Studio Codeをターミナルから起動するときの注意点[番外編]

アラサーOLのためのpython入門講座

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今日は定番エディタ「Visual Studio Code (VSCode)」をターミナルから起動できるように設定する際の注意点をご紹介します!VSCodeはターミナルで「code」というコマンドで起動できるように設定することができます。ところが、設定後しばらくして「code」を実行してみると、

zsh: command not found: code

というエラーになってしまいました。

今回はこのエラーの対処法をご紹介します!この記事を読めば、 VSCodeをターミナルから起動できるようになります!一つ一つ説明しますので、一緒にやってみましょう!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • VSCodeをターミナルから起動したい
  • Codeコマンドがエラーになった!

Abstract | 「command not found: code」エラーは解消できる

VSCodeをターミナルから起動するcodeコマンドが

zsh: command not found: code

によって通らないエラーは、/usr/local/binに設置されたシンボリック

/usr/local/bin/code

のリンク先を手動で変更することで解消することができます。VSCodeのコマンドパレットからcodeコマンドを登録すると、リンク先がキャッシュ領域内のファイルになってしまうことがあるようです。これにより、キャッシュクリアと同時にcodeコマンドが機能しなくなりcommand not foundエラーとなります。リンク先の本体を手動で

/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code

に指定し直すことで解消することができます。



Background | VSCodeのappでのターミナル起動設定

前回記事

では、VSCodeのインストール方法をご紹介しました。
この記事の中で、VSCodeのコマンドパレットという機能を使って、ターミナルから起動できるように設定しました。ターミナルでの起動設定を行うことで、ターミナルに「code」と入力するだけでVSCodeを立ち上げられるようになります(具体的な設定方法は上記の過去記事をご覧ください)。

私自身、上記の過去記事の方法によって一度はcodeコマンドが設定でき、ターミナルからVSCodeを起動できるようになりました。しかし、私の環境(M2 MacBook Pro)ではしばらくするとcodeコマンドがエラーになってしまいました。



Data | codeコマンドが「command not found」エラーになる

VSCodeのコマンドパレットからcodeコマンドを登録した後、VSCodeを終了ししばらくするとcodeコマンドが通らなくなるエラーが発生することがあるようです。具体的には、

code

を実行すると

zsh: command not found: code

というエラーになります。同様に

which code

を実行しても

code not found

となります。



/usr/local/bin/codeはシンボリックリンク

codeコマンドは

/usr/local/bin/

に設置されたシンボリックリンクです。

シンボリックリンクはファイル本体が別の場所に存在し、当該の場所にはリンクだけ存在するというものです。なので、lsコマンドでオプションをつけずに

ls /usr/local/bin/code

と確認すると、

/usr/local/bin/code

とリンク元が表示されます。リンク元は存在するので、lsコマンドは通ります。



原因はシンボリックリンクのリンク先が不適切なこと

codeコマンドが

zsh: command not found: code

というエラーになった原因はシンボリックリンクのリンク先が不適切だからです。lsコマンドにオプションを付けて、リンク先のファイルも確認してみます。以下を実行してみましょう。

ls -l /usr/local/bin/code

結果は以下のようになります。

lrwxr-xr-x  1 kaiko  wheel  167  4  6 12:57 /usr/local/bin/code -> /private/var/folders/fy/168m9c3j6x34ddzdhwtw45s80000gn/T/AppTranslocation/91EDD38F-BCE7-456F-9E31-8516AC876D88/d/Visual Studio Code.app/Contents/Resources/app/bin/code

/usr/local/bin/codeのリンク先は

Visual Studio Code.app/Contents/Resources/app/bin/code

であることがわかりますが、「Visual Studio Code.app」が存在する場所がおかしいです。

「Visual Studio Code.app」は本来、「/Application」に存在するはずです。しかし、上記のリンク先は「/private/var/folders/…以下省略」に存在することになっています。この場所は一時的に利用されるキャッシュで、Visual Studio Code.appを終了すると削除されます。したがって、Visual Studio Code.appが開いている間はcodeコマンドが通るけれども、Visual Studio Code.appを終了するとcodeコマンドが通らなくなるという残念な結末になります。

以上から、/usr/local/bin/codeのリンク先を正しいもの、すなわち

/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

にすれば解決できることがわかります。



うまく行かなかった解決策 | VSCodeのコマンドパレットからやり直し

私の環境ではうまく行かなかった解決先をご紹介します。VSCodeを\Applicationsフォルダに移動した後、再度開いて、コマンドパレットからcodeコマンドを登録し直すというものです。こちらの外部記事(リンク)の方はこれで解決できたようですが、私の環境ではうまくいきませんでした。/usr/local/bin/codeのリンク先は相変わらずキャッシュ領域のファイルのままでした。



Method | 手動でcodeコマンド(シンボリックリンク)を再設定

/usr/local/bin/codeのリンク先を正しいものにするために、シンボリックリンクを手動で再設定します。ターミナルから以下のコマンドを実行します。

ln -s /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code /usr/local/bin/code

これが通ればcodeコマンドが使えるようになるはずです。



「ln: /usr/local/bin/code: File exists」となる場合→-fオプションを追加

上記の「ln -s」コマンドが

ln: /usr/local/bin/code: File exists

となる場合、すでに作成されているリンク元ファイル「/usr/local/bin/code」を上書きする必要があります。

以下のように「ln -s」コマンドに-fオプション(強制上書き)を追加します。

ln -sf /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code /usr/local/bin/code

上記を実行すると、/usr/local/bin/codeのリンク先が/Applicationフォルダ配下のファイルに変更されます。



「permission denied」となる場合→権限を付与してから再実行

上記の「ln -s」コマンドや「ln -sf」コマンドが

permission denied

というエラーになる場合、/usr/local/binの所有権が付与されていないと思われますので付与しておきます。

ターミナルで、

sudo chown -R YOURNAME /usr/local/bin

を実行します。YOURNAMEのところはご自身のユーザー名に変更してください。パスワードが要求されるので入力してください。実行すると/usr/local/binの所有権がユーザーに付与されます。所有権の付与ができたら、前述の「ln -s」や「ln -sf」コマンドを実行してください。



Result | codeコマンドの動作を確認

シンボリックリンクを手動でやり直したら、codeコマンドの動作を確認します。まずは

code

を実行してVSCodeのウィンドウが開くことを確認します。

シンボリックリンクの内容も確認しておきましょう。以下を実行してみてください。

ls -l /usr/local/bin/code

今度は以下のように表示されます。

lrwxr-xr-x  1 kaiko  wheel  68  4 18 06:08 /usr/local/bin/code -> /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

シンボリックリンクのリンク先が/Applications配下のファイルになっていることがわかります。

これでいつでもターミナルからVSCodeを起動できるようになりました。



Discussion | codeコマンドの正体はshellスクリプト

codeコマンドの正体は/usr/local/bin/codeのリンク先、すなわち

/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

というファイルですが、このファイルは実はテキストファイルでshellスクリプトです。

catコマンドで中身を確認してみましょう。

cat /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code

を実行すると

#!/usr/bin/env bash
#
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.

# when run in remote terminal, use the remote cli
if [ -n "$VSCODE_IPC_HOOK_CLI" ]; then
	REMOTE_CLI="$(which -a 'code' | grep /remote-cli/)"
	if [ -n "$REMOTE_CLI" ]; then
		"$REMOTE_CLI" "$@"
		exit $?
	fi
fi

function app_realpath() {
	SOURCE=$1
	while [ -h "$SOURCE" ]; do
		DIR=$(dirname "$SOURCE")
		SOURCE=$(readlink "$SOURCE")
		[[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE
	done
	SOURCE_DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
	echo "${SOURCE_DIR%%${SOURCE_DIR#*.app}}"
}

APP_PATH="$(app_realpath "${BASH_SOURCE[0]}")"
if [ -z "$APP_PATH" ]; then
	echo "Unable to determine app path from symlink : ${BASH_SOURCE[0]}"
	exit 1
fi
CONTENTS="$APP_PATH/Contents"
ELECTRON="$CONTENTS/MacOS/Electron"
CLI="$CONTENTS/Resources/app/out/cli.js"
ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --ms-enable-electron-run-as-node "$@"
exit $?

と表示されます。codeコマンドを実行するとこのシェルスクリプトが実行されることでVSCodeが立ち上がります。



Conclusion | まとめ

最後までご覧頂きありがとうございます!
Visual Studio Code (VSCode)をターミナルから起動できるようにするためのトラブルシューティングをご紹介しました。

VSCodeをターミナルから起動するためのcodeコマンドは/usr/local/binに設置されたシンボリックリンクです。VSCodeのコマンドパレットからcodeコマンドを登録すると、リンク先がキャッシュ領域内のファイルになってしまい、キャッシュクリアと同時にcodeコマンドが機能しなくなりcommand not foundエラーとなることがあります。リンク先の本体を手動で正しく指定し直すことで解消することができます。

以上「python入門講座 | Visual Studio Codeをターミナルから起動するときの注意点[番外編]」でした!
またお会いしましょう!Ciao!

コメント

タイトルとURLをコピーしました