Abrindo um Terminal para o script bash atual, se não foi iniciado em um

2

Como posso obter um script para se reiniciar em uma janela do Terminal se não foi iniciado em uma?

Com base nessa pergunta , tentei, em um arquivo chamado testtermexecutável marcado:

#! /bin/sh
if [ -t 0 ];  # stdin
then
    echo "yay! terminal!"
else
    Terminal sh ~/Desktop/testterm
fi

... mas o Haiku Terminalapenas abre e nunca mostra nada, ou às vezes abre e desaparece imediatamente.

No Terminal, se eu digitar Terminal sh ~/Desktop/testterm, funciona uma vez, abrindo um Terminal com "yay! Terminal!" nele, mas tentativas subseqüentes produzem terminais vazios.

Kev
fonte
1
Não chame seu arquivo testcomo você provavelmente está chamando do sistema /usr/bin/test.
slhck
Obrigado, eu não tinha pensado nisso. Editou a pergunta. (Ele ainda não funciona, mas pelo menos eu sei que não é por causa de um conflito de nomes neste momento.)
Kev
1
O teste está funcionando? Substitua Terminalpor outro comando, ele foi executado corretamente?
terdon
1
Eu realmente não sei muito sobre o Haiku, mas eis o que eu tentaria: 1. Remova o espaço entre o shebang e /bin/sh. 2. Use um caminho relativo ou absoluto para o testterm. 3. Tente executar a Terminal testterm &partir de um terminal. Todos os emuladores de terminal com os quais trabalhei exigem uma opção antes do executável (por exemplo, xterm -e ./testterm).
Dennis
1
Supondo que Terminalfuncione como xterm, o arquivo que ele está procurando é o shell que ele deve executar. Nesse caso, posso pensar em uma solução alternativa. Tente executar Terminal sh, ele usa em shvez de bash?
terdon

Respostas:

1

Um truque que você pode tentar é o seguinte:

  1. Crie um basharquivo .rc especial que origine seu bashrce execute seu script. Vamos chamá-lo~/foo.rc

    $ cat ~/foo.rc
    #!/bin/sh
    ~/Desktop/testterm
  2. Criar um novo "shell" que chama bashcom ~/foo.rcque seu arquivo .rc. Salve este script como fake_shellem algum lugar do seu $PATH(por exemplo ~/config/bin) e torne-o executável:

  3. Agora, no seu testtermscript, inicie Terminalusando fake_shellcomo shell.

O script se torna:

#!/bin/sh
if [ ! -t 0 ];  # stdin
then
    TIMESTAMP=`date +%Y%m%d%H%M`
    echo "#!/bin/sh
    source /boot/common/etc/profile
    $0" > ~/temp_term$TIMESTAMP.rc
    echo "#!/bin/sh
    bash --rcfile ~/temp_term$TIMESTAMP.rc" > ~/config/bin/temp_shell$TIMESTAMP
    chmod a+x ~/config/bin/temp_shell$TIMESTAMP
    Terminal temp_shell$TIMESTAMP
    rm -f ~/config/bin/temp_shell$TIMESTAMP
    rm -f ~/temp_term$TIMESTAMP.rc
fi

echo "yay! terminal!"
# your script here
exit
Terdon
fonte
@ Kev, veja minha resposta atualizada para um hack que você pode tentar.
terdon
Impressionante! 99% do caminho até lá, o que é tudo o que preciso. Algumas coisas, o prompt na nova janela é em bash-4.0#vez de />(não importa) e quando você fecha a janela, ele diz: The process "bash" is still running. If you close the Terminal, the process will be killed. (Os terminais normalmente fecham. Também não é grande coisa.)
Kev
@ Kev, o prompt pode ser alterado definindo a PS1variável foo.rc, a razão pela qual ela é diferente é porque /etc/bash.bashrcnão é lida, então você também pode corrigir isso utilizando a fonte foo.rc. Quanto ao erro, é porque você está iniciando explicitamente /bin/bash. Tente iniciar em segundo plano ( &embora eu duvide que funcione).
terdon
A &faz com que o terminal aparece em branco novamente, apesar de que se a sintaxe correcta para comandos asyncronous em Haiku. Obrigado pela dica PS1, vou procurar isso. BTW não sei por que minha edição saiu de vista engraçado ...
Kev