명령 대체를 통해 하나의 명령에서 문자열 대체를 사용하는 방법은 무엇입니까?

명령 대체를 통해 하나의 명령에서 문자열 대체를 사용하는 방법은 무엇입니까?

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를 하나로 결합하려면 어떻게 해야 합니까?

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에서는 작동하지 않습니다.

관련 정보