Você poderia fazer:
expect -c 'spawn -noecho root -l SummerStd_140PU_NM1_his.root
send "TBrowser a;\r"
interact'
Eu estou escrevendo um script bash para realizar algumas análises usando o programa ROOT . Eu quero executar algum comando inicial para carregar o resultado da análise, então continue usando ROOT interativamente.
A parte de análise vai bem, mas o problema é que depois de root
executar meu comando inicial, ele fecha imediatamente. Até agora tentei a construção EOF (here-file) para passar meu comando inicial e estou um pouco familiarizado com o shell script, então gostaria de obter suas opiniões sobre como manter ROOT
em execução após a execução do script. Isto é, eu gostaria de ver o prompt ROOT em vez do prompt do sistema.
./runReader.py SummerStd 140PU_NM1
root -l SummerStd_140PU_NM1_his.root << EOF
TBrowser a;
EOF
O código acima executa a análise e executa root
; no entanto, ele termina imediatamente e não tenho tempo para inspecionar o TBrowser, pois tenho o prompt do sistema em vez do prompt ROOT. Gostaria que o controle permanecesse no prompt de comando do root
depois que o script envia o comando TBrowser
para o programa, para que eu possa inserir comandos adicionais manualmente.
Com o ROOT, isso é realmente fácil. Quando o programa root
tiver lido os arquivos transmitidos na linha de comando, ele continuará a ler comandos interativos (a menos que você passe a opção -q
). Assim, você pode passar seus comandos de inicialização em um parâmetro de arquivo adicional, por meio de um descritor de arquivo extra .
#!/bin/sh
./runReader.py SummerStd 140PU_NM1
root -l SummerStd_140PU_NM1_his.root /dev/fd/3 3<<'EOF'
TBrowser a;
EOF
Esta é a melhor abordagem no Linux, FreeBSD e OSX, mas root
parece ignorar os arquivos que ele vê como tendo um comprimento de 0, então pode não funcionar em algum outro as variantes do UNIX em que /dev/fd
não é um arquivo normal como o Solaris ( /dev/fd
é um dispositivo arquivo) ou AIX e HP-UX ( /dev/fd
não existe). Se você precisar executar seu script nessas plataformas, poderá colocar seu comando de inicialização em um arquivo temporário¹. O comando trap
configura rm -f "$tmp_root"
para ser executado quando o script é encerrado.
#!/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
¹ Eu não estou usando mktemp
porque não está disponível em algumas das plataformas "exóticas" (ou seja, não Linux ou * BSD) nas quais você usaria esse script.