良いと聞いたfishシェルをお試し中。が、SDKMANが動かない…。
fishシェルでも動作する方法を上げてくれている人がいて、その方法+αで一応動作するようになった。
ほとんど、 Using SDKMAN with the Fish Shell | Ted Wise に書いてある方法。
まずは、 ~/.config/fish/functions/sdk.fish
を以下の内容で作成。(上記Webサイトから転載)
function sdk --description 'Software Development Kit Manager'
set after_env (mktemp -t env)
set path_env (mktemp -t env)
bash -c "source ~/.sdkman/bin/sdkman-init.sh && sdk $argv && printenv > $after_env"
# remove any pre-existing .sdkman paths
for elem in $PATH
switch $elem
case '*/.sdkman/*'
# ignore
case '*'
echo "$elem" >> $path_env
end
end
for env in (cat $after_env)
set env_name (echo $env | sed s/=.\*//)
set env_value (echo $env | sed s/.\*=//)
switch $env_name
case 'PATH'
for elem in (echo $env_value | tr ':' '\n')
switch $elem
case '*/.sdkman/*'
echo "$elem" >> $path_env
end
end
case '*'
switch $env_value
case '*/.sdkman/*'
eval set -g $env_name $env_value > /dev/null
end
end
end
set -gx PATH (cat $path_env) ^ /dev/null
rm -f $after_env
rm -f $path_env
end
これで、例えば sdk list gradle
すると実行はできるようになる。
ただ、これだけだと、シェルを開いた時に gradle -v
するとPATHが通ってなくて実行できなくて、一回何かしらsdkコマンドを実行しないとダメ。
なので、 config.fish
に以下を追記する。
sdk help > /dev/null
ここまでの設定をすれば、fishシェルでもSDKMANが使えるようになるんだけど、SDKMANにアップデートがあると、アップデート可否の質問が出たまま止まってしまう…。
これを防止するために、暫定でSDKMAN自身のアップデートを自動に設定しておいた。
sdkman_auto_selfupdate=true
関連:fishシェルでJAVA_HOMEを設定
Macで、zshとかbashから引き継いで、
export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_45`
って、 config.fish
に書いてもJAVA_HOMEがセットされない。
fishシェルの場合は、こんな書き方。 java_home
の実行がバッククォートじゃないのがポイント。
set -x JAVA_HOME (/usr/libexec/java_home -v 1.8.0_45)
これで、SDKMANもSDKMANでインストールしたものも実行できるようになる。