$(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
を使ってスクリプトを書かないほうがいいらしい。
上記によれば、Gitはスクリプトで使用するために明示的に設計されたplumbingインターフェースを提供しているとのこと。
なので自分はplumbingインターフェースを使ってみようと思います。