Como separar as chamadas executáveis como funções diferentes no shell script?

0

Isso é o que eu gostaria de alcançar.

#!/bin/bash

function startBasics()
{
    gnome-terminal -e "sth" &
    gnome-terminal --tab -e "sth_else" &
}

function doOneThing()
{
    gnome-terminal --working-directory=/myDir1/build/ -e './myExecutable1' &
}

function doAnoterThing()
{
    gnome-terminal --working-directory=/myDir2/build/ -e './myExecutable2' &
}

$(startBasics)
$(doOneThing)
$(doAnoterThing)

No entanto, após o startBasics concluir, outras funções não serão executadas. Então eu coloquei todos eles no mesmo lugar dentro do startBasics e tentei novamente e isso parece funcionar corretamente.

Então, por que o código acima não funcionou? E qual é a maneira correta de escrever funções separadas?

    
por Anthon 02.02.2016 / 14:40

2 respostas

1

Seu:

$(startBasics)

não faz sentido e é a causa do seu problema. Isso é substituição de comando. $(cmd) expande para a saída de cmd (com novas linhas finais removidas e sujeitas a divisão + glob, como você não citou). Você está pedindo ao shell para criar um comando fora da saída de startBasics .

O que isso significa é que o shell precisa ler a saída de startBasics até o final do arquivo para expandi-lo. Essa expansão aqui será tomada como um comando para executar, o que faz pouco sentido.

Para obter a substituição de comando, o shell inicia startBasics com seu stdout redirecionado para um pipe e lê a partir da outra extremidade do pipe. Todos os processos gnome-terminal herdarão esse stdout.

O shell só verá eof na outra extremidade do canal quando todos os descritores de arquivo abertos para o fim da escrita (em todos os processos) tiverem sido fechados. Isso provavelmente só acontecerá quando todos os gnome-terminals iniciados por startBasics tiverem terminado.

Aqui, você quer:

#!/bin/sh -

startBasics() {
    gnome-terminal -e "sth" &
    gnome-terminal --tab -e "sth_else" &
}
doOneThing() {
    gnome-terminal --working-directory=/myDir1/build/ -e './myExecutable1' &
}
doAnoterThing() {
    gnome-terminal --working-directory=/myDir2/build/ -e './myExecutable2' &
}

startBasics
doOneThing
doAnoterThing

wait # if you'd rather wait for all those processes to finish
     # before exiting.
    
por 02.02.2016 / 16:31
0

Seu & inicia o comando em segundo plano. Então a queixa

after startBasics completes other functions do not execute at all.

é provavelmente devido ao fenômeno que esses outros programas estão executando e completando antes de startBasics completar.

Além disso, não é necessário encapsular o comando em $( ... ) . Simplesmente invocar a função como um comando funcionará:

startBasics
doOneThing
doAnoterThing

Mas de alguma forma eu suspeito que o que você quer fazer é executar esses comandos dentro de um terminal, um após o outro. Nesse caso, você faria algo como:

gnome-terminal --working-directory=/myDir2/build/ -x /bin/sh -c 'sthe; sthelse; ./myExecutable1; ./myExecutable2'

Veja link

    
por 02.02.2016 / 15:22