Abra vários terminais mas sem fechar o anterior usando o shell script

0

Estou começando em scripts de shell. Eu estou tentando abrir 4 terminal usando um script. Aqui está o código

for i in 1 2 3 4
do
    echo $i
    if [ $i -eq 1 ]; then
        # xterm -e 
        xterm -e "source /home/akshay/openapps.sh; bash"
        opensublime
    elif [ $i -eq 2 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        openspark
    elif [ $i -eq 3 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        openpycharm
    elif [ $i -eq 4 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        runproject 8000
    fi

done

O problema é que está abrindo um novo terminal, mas para o segundo terminal eu preciso fechar o primeiro. Como posso evitar o fechamento do terminal anterior para abrir o próximo.

Código completo

dpkg -s xterm  &> /dev/null
echo "Checking for Xterm"
if [ $? -eq 0 ]; then
    echo "Package  is installed!"
else
    echo "Package is not installed. Now installing package"
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install xterm
    echo "Package  is NOW installed!"
fi

for i in 1 2 3 4
    do
        echo $i
        if [ $i -eq 1 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            opensublime
        elif [ $i -eq 2 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            openspark
        elif [ $i -eq 3 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            openpycharm
        elif [ $i -eq 4 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            runproject 8000
        fi
    done

openapps.sh

function opensublime() {
  cd "/opt/Sublime Text 2"
  eval "./sublime_text"
  cd 
}
function openpycharm() {
  cd "/home/akshay/Documents/pycharm-community-2018.1.4/bin"
  eval "./pycharm.sh"
  cd 
}
function openspark(){
  cd "/opt/Spark/"
  eval "./Spark"
  cd 
}
function runproject(){
  cd "wr_workspace/corporate_admin/"
  eval "source ../env/bin/activate"
  echo "starting server on port $1"
  eval  "python manage.py runserver 127.0.0.1:$1"
  deactivate
  cd
}
    
por 108 12.07.2018 / 13:40

1 resposta

1

Se você quiser que seu script não espere a execução de um comando para terminar antes de prosseguir para o próximo comando, adicione & ao final da linha de comando.

Além disso, você não precisa de um loop se quiser fazer algo diferente a cada volta do loop. Basta listar as coisas que você deseja fazer em seqüência.

Depois de um pouco de retrocesso nos comentários, eu entendo que você quer que o xterm execute um bash shell que deve primeiro criar seu script openapps.sh e então executar uma função definida no script. Então, algo assim deveria funcionar:

xterm -e bash -c "source /home/akshay/openapps.sh; opensublime; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; openspark; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; openpycharm; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; runproject 8000; bash" &

Não tenho certeza se a parte ... ; bash é realmente necessária, mas guardei apenas por precaução.

Seus comandos originais tiveram alguns problemas:

xterm -e "source /home/akshay/openapps.sh; bash" 
opensublime

Isso diz ao xterm para executar a linha de comando source /home/akshay/openapps.sh; bash . Mas xterm não é um shell: ele só pode executar coisas que são arquivos executáveis reais no disco. source é um comando interno em shells no estilo Bourne e, portanto, não existe como um arquivo executável.

O script openapps.sh é originado pela instância de bash dentro do xterm, mas os comandos opensublime / openspark etc. estão tentando chamar as funções de openapps.sh em uma instância de shell diferente, que não necessariamente originou openapps.sh e, portanto, esses comandos podem falhar.

Então, você precisará de xterm para executar um shell dentro da nova janela xterm , com uma linha de comando especificada. xterm -e bash -c "<commands>" faz isso.

Se você quiser usar seu opensublime e outras funções, será necessário executá-las no mesmo shell que originou seu openapps.sh , caso contrário, elas provavelmente produzirão apenas command not found de mensagens de erro. E é por isso que esses comandos precisavam ser movidos dentro das aspas duplas.

As variáveis de ambiente

ulimit e export ed podem ser propagadas de um processo pai por um filho não-shell ( xterm neste caso) para um processo neto ( bash em execução no xterm ) , mas as funções do shell não serão passadas dessa maneira; eles precisarão ser recarregados.

    
por 12.07.2018 / 15:03

Tags