このプログラムを使用していくつかの分析を実行するためにbashスクリプトを書いています。根。いくつかの初期コマンドを実行して分析結果をロードし、ROOTを対話的に使用したいと思います。
解析部分はうまくいっていますが、問題はroot
初期命令実行直後に終了する点です。これまで、私は初期コマンドを渡すためにここにファイルがある(EOF)設定を試してみましたが、シェルスクリプトは初めてですROOT
。 。つまり、システムプロンプトの代わりにROOTプロンプトを見たいのです。
./runReader.py SummerStd 140PU_NM1
root -l SummerStd_140PU_NM1_his.root << EOF
TBrowser a;
EOF
上記のコードは分析を実行してから実行されますroot
。ただし、すぐに終了し、ROOTプロンプトの代わりにシステムプロンプトがあるため、TBrowserを確認する時間はありません。追加のコマンドを手動で入力できるように、スクリプトがプログラムにコマンドを送信root
した後、コマンドプロンプトで制御を維持したいと思います。TBrowser
答え1
次のことができます。
expect -c 'spawn -noecho root -l SummerStd_140PU_NM1_his.root
send "TBrowser a;\r"
interact'
答え2
ROOTを使用すると、実際には非常に簡単です。root
プログラムは、コマンドラインに渡されたファイルを読み取った後、インタラクティブなコマンドを読み続けます(この-q
オプションを渡さない限り)。したがって、ファイルパラメータを追加して起動コマンドを渡すことができます。追加ファイル記述子。
#!/bin/sh
./runReader.py SummerStd 140PU_NM1
root -l SummerStd_140PU_NM1_his.root /dev/fd/3 3<<'EOF'
TBrowser a;
EOF
これはLinux、FreeBSD、およびOSXに最適な方法ですが、root
長さがゼロのファイルを無視するように見えるため、他のファイルでは機能しない可能性があります。/dev/fd
通常のファイルのUnixバリアントではありません。たとえば、Solaris(/dev/fd
はデバイスファイル)またはAIXおよびHP-UX(/dev/fd
存在しません)です。これらのプラットフォームでスクリプトを実行する必要がある場合は、一時ファイルに起動コマンドを配置できます。このコマンドは、スクリプトの終了時に実行されるようにtrap
設定されます。rm -f "$tmp_root"
#!/bin/sh
./runReader.py SummerStd 140PU_NM1
tmp_root=tmp-$$.root
trap 'rm -f "$tmp.root"' EXIT HUP INT TERM
cat >tmp_root <<'EOF'
TBrowser a;
EOF
root -l SummerStd_140PU_NM1_his.root tmp.root
¹このスクリプトを使用する一部の「エキゾチック」(Linuxや* BSDではない)プラットフォームでは利用できないため、使用しませんでした。mktemp