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.


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

@ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.