ターミナル起動時に「tfenv」で「No such command 'init'」が出力される

概要
- ターミナル起動時に、anyenv でインストールした tfenv でエラーが発生した
- pyenv、rbenv など anyenv では複数のツールを利用しているが、初期化時にエラーが出ているのは、tfenvのみ
- ターミナル起動時に毎回出るので、消す方法がないかを調べた
環境
- MacOS Catalina (10.15.3)
- anyenv 1.1.0
- tfenv 2.0.0-beta1
問題
- ターミナル起動時に、anyenvでインストールした「tfenv」でエラーが発生する
Last login: Sun Mar 8 19:12:15 on ttys000 Agent pid 972 No such command 'init' Usage: tfenv <command> [<options>] Commands: install Install a specific version of Terraform use Switch a version to use uninstall Uninstall a specific version of Terraform list List all installed versions list-remote List all installable versions
- anyenv versionsとかを実行してもエラーが出力される
$ anyenv versions goenv: 1.12.5 * 1.13.4 (set by /Users/daicho/.anyenv/envs/goenv/version) nodenv: * 12.8.0 (set by /Users/daicho/.anyenv/envs/nodenv/version) pyenv: system 2.6.9 * 2.7.16 (set by /Users/daicho/.anyenv/envs/pyenv/version) * 3.7.0 (set by /Users/daicho/.anyenv/envs/pyenv/version) rbenv: system * 2.4.1 (set by /Users/daicho/.anyenv/envs/rbenv/version) tfenv: No such command 'versions' Usage: tfenv <command> [<options>] Commands: install Install a specific version of Terraform use Switch a version to use uninstall Uninstall a specific version of Terraform list List all installed versions list-remote List all installable versions
原因
- pyenvやrbenvにはサブコマンドにinitが存在するが、tfenvには存在していない(そもそも、tfenvが他のenv系とコマンド形体が違うのが原因)
$ tfenv -h Usage: tfenv <command> [<options>] Commands: install Install a specific version of Terraform use Switch a version to use uninstall Uninstall a specific version of Terraform list List all installed versions list-remote List all installable versions
- anyenvは「anyenv init」実行時に、一律「init」を実行しているので、エラーが出力されている
- 既にIssueにもなっていて、暫定対応ではあるが、PRがマージされたら出力はされなくなりそう
解決策
- 完全にその場しのぎ感しかないが、anyenvのコマンドを一時的に書き換える
- ただ、tfenvのコマンド形体が他のenv系コマンドと違うのが原因のため、その場しのぎの暫定対応でしかない
- tfenvが他のenv系コマンドに合わせたサブコマンドになるのか、それとも、anyenvから外されるとか今後ありそう
- 全てではないが、一旦、以下のコマンド系を修正する
- anyenv init
- anyenv version
- anyenv versions
- anyenvはhomebrewでインストールしているのでファイルを確認する
$ find $(brew --prefix) -name anyenv-init -o -name anyenv-version -o -name anyenv-versions /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-init /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-versions /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-version
- バックアップを取得後に手動でコマンドを修正する
/usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-init
$ cp -p /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-init{,.$(date +'%Y%m%d')}
$ vim /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-init
$ diff /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-init.20200308 /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-init
143c143,145
< echo "$(${ENV_ROOT}/bin/${env} init - ${no_rehash_arg}${shell})"
---
> if [[ ${env} != 'tfenv' ]]; then
> echo "$(${ENV_ROOT}/bin/${env} init - ${no_rehash_arg}${shell})"
> fi
/usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-version
$ cp -p /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-version{,.$(date +'%Y%m%d')}
$ vim /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-version
$ diff /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-version.20200308 /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-version
12c12,16
< echo "$env: $($env version)"
---
> if [ "$env" = "tfenv" ]; then
> echo "$env: $(tfenv list | grep \*)"
> else
> echo "$env: $($env version)"
> fi
/usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-versions
$ cp -p /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-versions{,.$(date +'%Y%m%d')}
$ diff /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-versions.20200308 /usr/local/Cellar/anyenv/1.1.0/libexec/anyenv-versions
13a14,15
> elif [ "$env" = "tfenv" ]; then
> echo "$($env list)"
- ターミナルを起動し直し、起動時にエラーが出力されなくなることを確認

- anyenv versionも問題なさそう(出力形式がちょっと違うけど、もうこの際、無視する)

- anyenv versionsも問題なさそう

まとめ
- anyenvでインストールしたtfenvでエラーが出力されていたので、手動でファイルを修正した
- ただ、暫定対応でしかないので、今後、もっといい方法があれば、修正していきたい