TL;DL
~/.config/fish/config.fishに以下を追記
set SSH_AGENT_FILE "$HOME/.ssh/ssh_agent"
test -f $SSH_AGENT_FILE; and source $SSH_AGENT_FILE > /dev/null 2>&1
if not ssh-add -l > /dev/null 2>&1
if not ps -ef | grep -v grep | grep ssh-agent
ssh-agent -c > $SSH_AGENT_FILE 2>&1
end
source $SSH_AGENT_FILE > /dev/null 2>&1
find $HOME/.ssh -name id_rsa | xargs ssh-add
end
fish 固有の仕様や構文の解説
set
fish には代入構文がないため set コマンドを使います。
set 変数名 値
変数置換は bash などと同じように $変数名 で使用可能です。
ちなみに -x オプションを付けることで export に相当するものになります。
test [EXPRESSION]; and hogehoge
fish では 他のシェルと違って && や || の代わりに以下を用います
&& -> and
|| -> or
! -> not
そのため上記コード2行目 test -f $SSH_AGENT_FILE; and source $SSH_AGENT_FILE > /dev/null 2>&1 では、 $SSH_AGENT_FILE が通常のファイルの場合 source コマンドで $SSH_AGENT_FILE を評価します。
> と 2> と /dev/null
> と 2> は標準出力と標準エラー出力をリダイレクトするために使います。
echo "hoge" > file.txt とすることで file.txt を hoge に書き換えることが出来ます。
しばしば上記コード内で出てくる/dev/nullはnullデバイスとも呼ばれ、このファイルに出力することで、出力を捨てることが出来ます。
そのため hoge > /dev/null 2> /dev/nullと書くことで標準出力と標準エラー出力ともに破棄することが出来ます。
また & の後にファイル記述子の番号を入れることで短く書くことも出来ます。
source $SSH_AGENT_FILE > /dev/null 2>&1
*標準エラー出力で使われていた^は廃止され将来削除予定なので2>を使いましょう。
そのほか
ざっと fish 固有の構文や仕様などを解説しましたが、残りは bash などでも共通のものなので、上記コードがどういった流れで動作するのかを書いて終わりにしたいと思います。
-
$SSH_AGENT_FILEが通常のファイルの場合sourceコマンドを用いて評価する -
ssh-add -lからSSH Keyの登録を確認し無ければ分岐する -
ps -ef | grep -v grep | grep ssh-agentで現在動作しているssh-agentプロセスがあるか確認、なければssh-agentを起ち上げる -
ssh-agentを起動した際に書き込んだ$SSH_AGENT_FILEを再度sourceコマンドを用い評価 - SSH Key を
ssh-addに渡して登録
あとがき
これで WSL + VSCode で開発している際に Terminal を立ち上げるたび passphrase を入力しなくてすみます!すみました!🎉