コマンド置換で1つのコマンドで文字列置換を使用するには?

コマンド置換で1つのコマンドで文字列置換を使用するには?

git branchコマンドが実行されると、通常は次のようになります。

* main 
.... # other branches

〜によってコマンドの置き換えそして文字列の置き換え期待どおりに動作します。

current_branch=$(git branch | head -n1)     #1
current_branch="${current_branch/* /}"      #2  
echo "current_branch: '${current_branch}'"

印刷のみ可能main

質問:

(可能であれば)行1と2を1つにまとめるにはどうすればよいですか?

current_branch=$(git branch | head -n1 | XXX)

それは何でなければならないかXXX

答え1

パラメータ拡張ではこれを行うことはできません。最終的にパラメータ拡張が機能する理由は次のとおりです。パラメータ

いつも「基本」を次のように考えているわけではありません。最初ポイントを表示します。私はお勧めします

git branch | sed -n 's/^[*] //p'

ただし、出力を処理せずに現在の分岐(HEADコミットの分岐)を取得する別の方法があります。

git rev-parse --abbrev-ref HEAD

答え2

"${current_branch/* /}"返された値を展開して、current_branch最後のスペースの前のすべての項目を削除します。と同じです"${var##* }"。必要に応じてsed(各行について、stdinの入力に対して)同じ操作を実行できますsed -e 's/.* //'。変数値を設定するコマンド置換がすでにあり、それをsedパイプラインに追加できるため、これを実行するのが妥当である可能性があります。

sed実際には以下を使用することもできますhead

current_branch=$(git branch | sed -e 's/.* //'  -e 1q)

一方、シェルのパラメータ拡張を使用すると、次の操作をすべて実行できます。

current_branch=$(git branch)
current_branch=${current_branch%%$'\n'*}    # remove from first NL
current_branch=${current_branch##* }        # remove to last SP

zsh では、次の拡張機能をカスケードで配置できます。

current_branch=${"$(git branch | head -n1)"/* /}

しかし、これはBashでは動作しません。

関連情報