いつかエンジニアになりたい

Nothing is too late to start

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

f:id:berukann:20200308192754p:plain

概要

  • ターミナル起動時に、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がマージされたら出力はされなくなりそう

github.com

github.com

解決策

  • 完全にその場しのぎ感しかないが、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)"
  • ターミナルを起動し直し、起動時にエラーが出力されなくなることを確認 f:id:berukann:20200308195416p:plain
  • anyenv versionも問題なさそう(出力形式がちょっと違うけど、もうこの際、無視する) f:id:berukann:20200308201911p:plain
  • anyenv versionsも問題なさそう f:id:berukann:20200308201828p:plain

まとめ

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