Shell

將命令從 shell 腳本傳遞給 ROOT 並使其保持打開狀態

  • August 5, 2014

我正在編寫一個 bash 腳本來使用程序ROOT執行一些分析。我想執行一些初始命令來載入分析結果,然後以互動方式繼續使用 ROOT。

分析部分進展順利,但問題是在root執行我的初始命令後,它立即關閉。到目前為止,我已經嘗試過 EOF(here-file)構造來傳遞我的初始命令,但我對 shell 腳本有點不熟悉,所以我想就如何ROOT在腳本執行後繼續執行獲得您的意見。那就是我希望看到 ROOT 提示而不是系統提示。

./runReader.py SummerStd 140PU_NM1 
root -l SummerStd_140PU_NM1_his.root << EOF
TBrowser a;
EOF

上面的程式碼執行分析然後執行root;但是,它立即終止,我沒有時間檢查 TBrowser,因為我有系統提示而不是 ROOT 提示。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 的文件,因此它可能不適用於其他一些不是正常文件的unix 變體,/dev/fd例如 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

¹我沒有使用mktemp它,因為它在您將使用此腳本的某些“外來”(即不是 Linux 或 *BSD)平台上不可用。

引用自:https://unix.stackexchange.com/questions/148023