Technology Engineering

178inaba の技術ブログ

$(git branch)でカレントディレクトリのファイル一覧も出てしまう時の対処法

とあるシェルでgitのブランチ一覧を取りたくて echo $(git branch) と書いたのだが、なぜかファイル一覧も出てしまい戸惑った。

前提

下記のようなディレクトリがあって、それがgit管理されていたとする。

$ ls
README.md   main.go     main_test.go

そして以下のようなブランチが存在する。

$ git branch
  develop
  feature/bar
  feature/baz
  feature/foo
* master

事象

echo $(git branch) を実行すると下記のようにブランチ一覧の間にファイル一覧が差し込まれてしまう。

$ echo $(git branch)
develop feature/bar feature/baz feature/foo README.md main.go main_test.go master

原因

勘のいい人はもうお分かりかもしれませんが、 git branch した時にmasterの前に * がついていますよね。
それが echoワイルドカードとみなされてファイル一覧が出てしまいます。

$ echo *
README.md main.go main_test.go

と同じになるわけです。

対処法

ダブルクオートで囲めばワイルドカードが展開されずに出力されます。

$ echo "$(git branch)"
  develop
  feature/bar
  feature/baz
  feature/foo
* master

ブランチ一覧を1行で取得したい場合

tr を使って * をスペースに変換したリストをダブルクオート無しで echo すれば取得可能です。

$ echo $(echo "$(git branch | tr '*' ' ')")
develop feature/bar feature/baz feature/foo master

でも、そもそも git branch を使ってスクリプトを書かないほうがいいらしい。

stackoverflow.com

上記によれば、Gitはスクリプトで使用するために明示的に設計されたplumbingインターフェースを提供しているとのこと。
なので自分はplumbingインターフェースを使ってみようと思います。

参考

stackoverflow.com