명령 출력을 배열로 보낼 때 슬래시를 이스케이프 처리합니다.

명령 출력을 배열로 보낼 때 슬래시를 이스케이프 처리합니다.

git branch -r현재 프로젝트에서는 다음과 같이 출력을 zsh의 배열로 가져오려고 합니다 .

% all_branches = ("${(@f)$(git branch -r)}")

그러나 이 명령을 실행하면 터미널에 다음과 같은 오류 메시지가 나타납니다.

zsh: bad pattern: (  origin/Backplane-Broken-Links

zsh의 분기 이름에 슬래시가 있는 문제가 있다고 추론합니다. git의 출력을 내 배열로 보낼 때 슬래시(및 다른 특수 문자가 있는 경우 다른 특수 문자)를 처리할 수 있는 방법이 있습니까?

답변1

( 에서 차용한 zsh것처럼 ) 의 배열 할당 구문은 다음과 같습니다.bashzsh

array=( value1 value2
 value3...)

양쪽에 공백이 있을 수 없습니다 (그러나 배열의 구성원을 구성하는 단어뿐만 아니라 평소와 같이 단어를 구분하는 데 사용되는 =공백, 탭 또는 개행 문자가 내부에 있을 수 있습니다 ).(...)

그래서 당신은 다음을 원합니다:

all_branches=("${(@f)$(git branch -r)}")

또는:

all_branches=( "${(@f)$(git branch -r)}" )

또는:

all_branches=(
  "${(@f)$(git branch -r)}"
)

어떤 스타일을 좋아하는지에 따라 다릅니다.

all_branches=(${(f)"$(git branch -r)"})

작동할 것입니다. 빈 요소를 유지하려면 "..."전체 확장을 플래그와 결합하세요. @git 브랜치 이름은 비워둘 수 없다고 생각하며 어쨌든 $(...)제거 될 것이라는 점에 유의하세요.모두후행 개행이므로 빈 분기가 출력 끝에 있으면 어쨌든 제거됩니다. 하지만 분할을 $(...)방지하려면 여전히 참조가 필요합니다 .$IFS

그건 그렇고, 이것은 array = ()and 함수 정의의 시작이 될 것입니다:array=

$ array = ()
function> echo test
$ array
test
$ =
test

하지만:

array = (foo|bar)

명령이 발견되면 glob 패턴(있는 경우)과 일치하는 파일을 인수로 사용하여 실행됩니다 array.=(foo|bar)

하지만 여기서는 ("${(@f)$(git branch -r)}")유효한 전역 패턴을 형성하지 않습니다.삭감.

완전성을 위해,

array = ( value1 value2 )

rc(Research Unix V10 및 plan9 셸)에서 유효한 구문입니다. 이 셸에서는 이 작업을 수행할 수 없으며 echo =구문 오류가 발생합니다. 견적이 필요합니다 =.

관련 정보