【fish shell】anyenvを入れた環境でbrew doctorするとWarning: "config" cripts exist outside your system...が出る件の対策

· 119 words · 1 minute read

結論

~/.config/fish/config.fish の設定は下記のようにします。

alias brew="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin command brew $argv"

やりたかったこと

下記の記事と同じ状況で同じwarnが出たので、簡単にエイリアスを設定して解消したいと思いました(anyenvを入れた環境でbrew doctorするとWarning: “config” cripts exist outside your system…が出る)。

【M1 Mac】anyenvを入れた環境でbrew doctorしたらWarning: “config” scripts exist outside your system…が出た時の対処法

しかし、fishでコマンドと同じ名前のエイリアスを設定するのはちょっと工夫がいりました。下記のように、コマンドと同じ名前のエイリアスを設定しようとすると、無限ループのエラーになります。

# NGな例
alias brew="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin command brew $argv"
fish: The function 'brew' calls itself immediately, which would result in an infinite loop.
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin brew
                                                                  ^

調べたこと

この理由は、fishでは alias コマンドは関数のシンプルなラッパーであるため、コマンドと同じ名前のエイリアスを設定しようとすると、関数内で関数(自分自身)を呼び出す動作をするためです。

alias - create a function — fish-shell 3.4.1 documentation

github.com issue | aliases don’t work, fish complains of recursive function call · Issue #224 · fish-shell/fish-

つまりこうなっています。(このような関数はそのままfish shell上で実行して試すことができます)

function hoge_command
  hoge_command &argv
end

fishでコマンドと同じ名前のエイリアスを設定したい場合は、 command をつけることで無限ループ問題が解決できます。 実行したいコマンド(今回はbrew)の前に command をつけることにより、関数ではなくコマンド(External command)を実行します。

command - run a program — fish-shell 3.4.1 documentation

つまりこのように書けばよいということでした。

function hoge_command
  command hoge_command &argv
end

今回の場合PATHの設定も必要なので、PATHを設定した後に command をつけてbrewを実行するようにしました。また、短い処理なのでエイリアスとしてワンライナーにしました。

alias brew="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin command brew $argv"