プログラムを使用して分析を実行するbashスクリプトを作成しています [〜#〜] root [〜#〜] 。初期コマンドを実行して分析結果をロードしてから、引き続きROOTをインタラクティブに使用したいと思います。
分析の部分はうまくいきますが、問題は、root
が最初のコマンドを実行した後、すぐに閉じることです。これまで、EOF(here-file)構文を使用して最初のコマンドを渡そうとしましたが、シェルスクリプトに少し慣れていないので、ROOT
を実行し続ける方法について意見を聞きたいと思います。スクリプトの実行後。つまり、システムプロンプトの代わりにルートプロンプトが表示されます。
./runReader.py SummerStd 140PU_NM1
root -l SummerStd_140PU_NM1_his.root << EOF
TBrowser a;
EOF
上記のコードは分析を実行してからroot
を実行します。ただし、すぐに終了し、ROOTプロンプトの代わりにシステムプロンプトがあるため、TBrowserを検査する時間がありません。スクリプトがroot
コマンドをプログラムに送信した後、コントロールをTBrowser
のコマンドプロンプトにとどめたいので、手動で追加のコマンドを入力できます。
あなたができること:
expect -c 'spawn -noecho root -l SummerStd_140PU_NM1_his.root
send "TBrowser a;\r"
interact'
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
は長さが0であると見なされるファイルを無視しているようであるため、他のファイルでは機能しない可能性があります Solaris(_/dev/fd
_はデバイスファイル)やAIXおよびHP-UX(_/dev/fd
_はそうではない)など、_/dev/fd
_が通常のファイル ではないunixバリアントtが存在します)。これらのプラットフォームでスクリプトを実行する必要がある場合は、スタートアップコマンドを一時ファイル¹に入れることができます。 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
_
¹ mktemp
は、このスクリプトを使用する「エキゾチック」(つまり、Linuxや* BSDではない)プラットフォームの一部では使用できないため、使用していません。