Fish ShellのFunctionを試してみた

2021.03.04

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

最近remind101/assume-roleというツールをMac環境に設定したのですが、その際にfunctionの設定でちょっと困りました。

assume-roleコマンドを実行時に、evalAWS_ACCESS_KEY_IDなどを設定しておきたい場合には、assume-role/README.mdにもある通り、以下のように設定しておくと便利です。

zshの場合

alias assume-role='function(){eval $(command assume-role $@);}'

bashの場合

function assume-role { eval $( $(which assume-role) $@); }

一方わたしはMac環境のシェルにFish Shellを利用しているので、~/.config/fish/config.fishに上記設定をしようとしてみたのですが、エラーとなり設定できませんでした。

調べてみると、Fish ShellにはFunctionというものがあり、どうもこれを使ったほうが良さそうなので設定してみました。

Autoloading functions

シェル起動後に利用できるようにするには、FunctionをAutoloading functionsとして設定すると良いようです。

Functionは~/.config/fish/functionsディレクトリの配下にfunction-name.fishとしてファイルを配置すれば良いようなので、今回は~/.config/fish/functions/assume-role.fishとうファイルを作成します。

Functionの定義

今回、Functionは以下のように作成しました。

~/.config/fish/functions/assume-role.fish

# remind101/assume-role
function assume-role
    eval (/usr/local/bin/assume-role $argv);
end

なお、元々設定したかったのは下記なので、assume-roleコマンドの絶対パスは自動で取得するのが良いのですが、whichを組み合わせた場合にうまく動かせなかったのでちょっとお茶を濁しています。

function assume-role { eval $( $(which assume-role) $@); }

実際に以下のようにシェルを起動し直してコマンドを実行すると、想定どおりに動かすことができました!

# fishのfunctionで、assume-role時にevalまで実行
$ assume-role foo
MFA code: 123456

# evalがちゃんと動いているか確認
$ env | grep ASSUMED_ROLE
ASSUMED_ROLE=foo

まとめ

以上、Fish ShellのFunctionを試してみました。大体はaliasで事が済んでしまうので、いままでは使ったことがなかったのですが、Functionは色々と使い所がありそうなので覚えておきたいと思います。

どなたかのお役に立てば幸いです。それでは!