我正在编写一个 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)平台上不可用。