スクリプトを作成しようとしているが、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
。