シェルスクリプトで ROOT にコマンドを渡して開いたままにします。

シェルスクリプトで ROOT にコマンドを渡して開いたままにします。

このプログラムを使用していくつかの分析を実行するために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

関連情報