Bash에서 에코 목록은 "/"를 제거합니다.

Bash에서 에코 목록은 "/"를 제거합니다.

내가 찾은이 편리한 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 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험그리고공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?.

이는 원본 스크립트가 실패한 이유가 아니라 예제가 실패한 이유를 설명합니다. 내가 아는 한, 원문의 모든 내용은 정확하게 인용되었습니다.

관련 정보