이전 브랜치를 선택하고 확인하는 편리한 bash 함수 를 발견 했습니다 . 그것은 매력처럼 작동했습니다. 핵심 비트는 다음과 같습니다.
BRANCHES=(
$(
git reflog |
egrep -io "moving from ([^[:space:]]+)" |
awk '{ print $3 }' | # extract 3rd column
awk ' !x[$0]++' | # Removes duplicates. See http://stackoverflow.com/questions/11532157
egrep -v '^[a-f0-9]{40}$' | # remove hash results
while read line; do # verify existence
([[ $CHECK_EXISTENCE = '0' ]] || git rev-parse --verify "$line" &>/dev/null) && echo "$line"
done |
head -n "$NUM"
)
)
if [[ $INTERACTIVE = '1' ]]; then
PS3="Choose a branch: "
select d in "${BRANCHES[@]}"; do
test -n "$d" && break
echo ">>> Invalid Selection"
done
git checkout "$d"
else
printf '%s\n' "${BRANCHES[@]}"
fi
브랜치 이름은 모두 bug/...
또는 task/...
.
어떤 이유로 오늘은 실패하기 시작했습니다. 내가 그것을 함께 디버깅 할 때 set -x
, 나는 것을 발견 echo ${BRANCHES[@]}
하는 select
을 제거하고, 인용 부호로 둘러싸이지 않은 평가가 나타납니다 /
.
문제를 단순화 / 확인하기 위해 다음을 실행했습니다.
foo=( "a/b" "c/d" )
echo $foo
# prints a b
echo ${foo[@]}
# prints a b c d
echo "${foo[@]}"
# prints a/b c/d
이 문제는 예상대로 내 별칭 / 기능 전체에 혼란을 일으키고 있습니다.
이상하게도 스크립트의 함수는 다음을 인쇄합니다.
1) master
task
2) 16658-...
task
3) 16525-...
Choose a branch:
foo
예상대로 인쇄 에서 선택 :
select f in "${foo[@]}"; do
echo $f
break
done
# prompts:
# 1) a/b
# 2) c/d
근본 원인에 대해서는 틀렸을 수도 있지만 의심 스럽습니다. 1
위의 프롬프트에서 선택하면 에코가 발생 a b
합니다.
사실로...
foo=a/b
echo $foo
# prints a b
echo "$foo"
# prints a/b
foo="a/b"
echo $foo
# prints a/b
중요하다면 Windows 용 git-bash를 유닉스 bash 대신 사용하고 있지만 그게 문제라고 생각할 수 없습니다.
어떤 아이디어?
인용되지 않은 것을 에코하면 split + glob으로 알려진 것이 적용됩니다. 이것은 당신이 에코하는 것은 변수의 모든 문자로 분할되고 IFS
glob으로 처리되고 일치하는 경우 해당 glob이 확장된다는 것을 의미합니다. 여기서 신경 쓰는 부분은 분할입니다. 설명하는 것은 기본값 IFS
(공백, 탭 및 줄 바꿈)으로는 발생할 수 없습니다 . 이 동작이 보이면 사용자 (또는 셸 세션에있는 항목)가 IFS
다른 것으로 설정 한 것 /
입니다. 설명하기 위해 :
$ foo=( "a/b" "c/d" )
$ echo ${foo[@]}
a/b c/d
## Now, change IFS
$ IFS='/'
$ echo ${foo[@]}
a b c d
## Of course, properly quoting fixes it
$ echo "${foo[@]}"
a/b c/d
## And so does un-setting IFS
$ unset IFS
$ echo ${foo[@]}
a/b c/d
이것은 항상 변수를 인용해야하는 이유 중 하나 일뿐입니다. 이에 대한 자세한 내용 은 bash / POSIX 셸에서 변수를 인용하는 것을 잊은 보안 의미 와 셸 스크립트가 공백이나 기타 특수 문자로 인해 질식하는 이유 를 참조하십시오 . .
이것은 원본 스크립트가 실패한 이유가 아니라 예제가 실패한 이유를 설명합니다. 원본에는 내가 말할 수있는 한 모든 것이 적절하게 인용되어 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다