스크립트를 작성하려고 하는데 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
.