zsh에서 배열 요소에 액세스할 수 없습니다.

zsh에서 배열 요소에 액세스할 수 없습니다.

스크립트를 작성하려고 하는데 zsh목표를 우아한 방식으로 달성하려면 배열을 사용해야 합니다. 온라인에서 일부 정보를 읽은 후 다음과 같은 방법으로 배열 요소를 구현하고 액세스하려고 했습니다.

### Script for running everything in screens ###
killall -15 screen ## We make sure that no screens are running for now
#bkgarr=(TopJets BosonJets DiBoson TTbar)
bkgarr=(1 2 3)

screen -dmS "MYSCREEN"
screen -S "MYSCREEN" -p 0 -X stuff 'echo "The array has ${#bkgarr[*]} of elements."^M'
screen -S "MYSCREEN" -p 0 -X stuff 'echo ${#bkgarr[0]}^M'

그러나 이것은 작동하지 않으며 다음과 같은 출력을 얻습니다.

~/Summer_Students/nTupler_topness/tupleAnalyzer% echo "The array has ${#bkgarr[*]} of elements."
The array has 0 of elements.
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo ${#bkgarr[0]}
0

또한 이 최소 작업 예제에서 주석 처리된 것과 같은 문자열 배열이 필요합니다. 누군가 내 실수와 어레이가 컴퓨터 메모리에 저장되지 않은 이유를 지적할 수 있다면 기쁠 것입니다.

코드 편집:

### Script for running everything in screens ###
killall -15 screen ## We make sure that no screens are running for now
#bkgarr=(TopJets BosonJets DiBoson TTbar)
bkgarr=(1 2 3)

screen -dmS "MYSCREEN"
screen -S "MYSCREEN" -p 0 -X stuff "$(typeset -p bkgarr)"$'\r'
#screen -S "MYSCREEN" -p 0 -X stuff 'bkgarr=(1 2 3)^M'
screen -S "MYSCREEN" -p 0 -X stuff 'echo "The array has ${#bkgarr[*]} of elements."^M'
screen -S "MYSCREEN" -p 0 -X stuff 'echo ${#bkgarr[0]}^M'

그런 다음 출력합니다.

~/Summer_Students/nTupler_topness/tupleAnalyzer% declare -a bkgarr='([0]="1" [1]="2" [2]="3")'
declare: bkgarr: can't assign initial value for array
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo "The array has ${#bkgarr[*]} of elements."
The array has 0 of elements.
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo ${#bkgarr[0]}
0
~/Summer_Students/nTupler_topness/tupleAnalyzer%

미리 감사드립니다

답변1

배열은 화면 터미널 창에서 실행되는 배열이 아니라 스크립트를 해석하는 셸에서 정의됩니다.

화면 창에 전달하려면 zsh다음을 시도하십시오.

screen -S "MYSCREEN" -p 0 -X stuff "$(typeset -p bkgarr)"$'\r'

개행 문자를 캐리지 리턴 문자가 아닌 개행 문자로 보냅니다. 하지만 이것은 괜찮습니다 zsh(개행 문자가 명령줄에 삽입되고 해당 행이 허용되지 않는다는 점만 다릅니다(이 역시 괜찮습니다).)

배열에 ^C, ", \e문자 또는 기타 터미널 관련 문자 또는 가 포함되어 있으면 작동하지 않습니다 zle. screen's stuff쉘이 입력을 수신할 준비가 되지 않은 경우에도 마찬가지입니다.

Hook 의 일부로 검사되는 fifo 파일을 통해 창 내부에서 실행되는 셸에 정보를 전달하는 다른 방법을 찾고 싶을 수도 있습니다 precmd.

관련 정보