从 shell 脚本将命令传递给 ROOT 并使其保持打开状态

从 shell 脚本将命令传递给 ROOT 并使其保持打开状态

我正在编写一个 bash 脚本来使用该程序执行一些分析。我想运行一些初始命令来加载分析结果,然后继续交互使用 ROOT。

分析部分进展顺利,但问题是root执行我的初始命令后,它立即关闭。到目前为止,我已经尝试使用 EOF(此处文件)构造来传递我的初始命令,但我对 shell 脚本有点不熟悉,因此我想了解您对如何ROOT在脚本执行后继续运行的意见。也就是说我想看到 ROOT 提示而不是系统提示。

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

上面的代码执行分析然后运行root;但是,它立即终止,我没有时间检查 TBrowser,因为我有系统提示符而不是 ROOT 提示符。我希望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似乎会忽略长度为 0 的文件,因此它可能不适用于其他一些文件/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

¹我没有使用它,mktemp因为它在您使用此脚本的某些“异国情调”(即不是 Linux 或 *BSD)平台上不可用。

相关内容