ターミナル起動時に「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でエラーが出力されていたので、手動でファイルを修正した
- ただ、暫定対応でしかないので、今後、もっといい方法があれば、修正していきたい