Passe um comando para ROOT de um script de shell e mantenha-o aberto

3

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.

    
por Vesnog 02.08.2014 / 14:08

2 respostas

2

Você poderia fazer:

expect -c 'spawn -noecho root -l SummerStd_140PU_NM1_his.root
           send "TBrowser a;\r"
           interact'
    
por 05.08.2014 / 15:40
1

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.

    
por 05.08.2014 / 19:19