web-dev-qa-db-ja.com

シェルスクリプトからROOTにコマンドを渡し、開いたままにします

プログラムを使用して分析を実行する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のコマンドプロンプトにとどめたいので、手動で追加のコマンドを入力できます。

4
Vesnog

あなたができること:

expect -c 'spawn -noecho root -l SummerStd_140PU_NM1_his.root
           send "TBrowser a;\r"
           interact'
3

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ではない)プラットフォームの一部では使用できないため、使用していません。