結論
~/.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
つまりこうなっています。(このような関数はそのまま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"