내가 찾은이 편리한 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
중요한 것은 Unix bash가 아닌 Windows에서 git-bash를 사용하고 있지만 그것이 문제라고는 상상할 수 없습니다.
어떤 아이디어가 있나요?
답변1
인용되지 않은 콘텐츠를 에코하면 분할+글로브(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 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험그리고공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?.
이는 원본 스크립트가 실패한 이유가 아니라 예제가 실패한 이유를 설명합니다. 내가 아는 한, 원문의 모든 내용은 정확하게 인용되었습니다.