Como melhorar o script bash de uma linha longa para um método melhor?

3

Eu tenho um script que abre o terminal e abre 5 guias, executa um determinado comando e acessa um determinado diretório de trabalho.

#!/bin/sh

gnome-terminal --tab --title="Zookeeper" --profile Hold -e "sh -c '/home/kafka_2.11-0.8.2.2/bin/zookeeper-server-start.sh /home/kafka_2.11-0.8.2.2/config/zookeeper.properties'" --tab --title="Kafka" --profile Hold -e "sh -c 'sleep 5; /home/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh /home/kafka_2.11-0.8.2.2/config/server.properties'" --tab --title="APP-Binaries" --profile Hold --working-directory="/home/app-binaries" --tab --title="APP-DB" --profile Hold --working-directory="/home/prod/db"

[! [insira a descrição da imagem aqui] [1]] [1]

Ter tudo em uma linha é difícil de manter. Como posso melhorar para facilitar a leitura?

Eu tentei

#!/bin/sh

Tab=""

Tab+=("--tab --title='Zookeeper' --profile Hold -e 'sh -c /home/kafka_2.11-0.8.2.2/bin/zookeeper-server-start.sh /home/kafka_2.11-0.8.2.2/config/zookeeper.properties'")
Tab+=( "--tab --title='Kafka' --profile Hold -e 'sh -c 'sleep 5; /home/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh /home/kafka_2.11-0.8.2.2/config/server.properties'")
Tab+=(" --tab --title='APP-Binaries' --profile Hold --working-directory='/home/app-binaries'")
Tab+=(" --tab --title='APP-DB' --profile Hold --working-directory='/home/prod/db'")

# echo "${Tab[@]}"

gnome-terminal "${Tab[@]}"

exit 0

Até agora não está funcionando ainda! Estou aberto a qualquer sugestão que vocês possam ter para mim. Estou apenas procurando aprender e melhorar.

Obrigado,

    
por kyo 13.02.2016 / 15:48

3 respostas

7

Você pode usar \ para dividir comandos longos em várias linhas.

Exemplo:

#!/bin/bash

echo "Hello World!"
echo \
"Hello World!"

executando este script resulta em

$ ./test.sh 

Hello World!
Hello World!

No seu caso, você pode usar algo como

#!/bin/bash    

gnome-terminal \
--tab --title="Zookeeper" --profile Hold -e "sh -c '/home/benu/Downloads/kafka_2.11-0.8.2.2/bin/zookeeper-server-start.sh /home/benu/Downloads/kafka_2.11-0.8.2.2/config/zookeeper.properties'" \
--tab --title="Kafka" --profile Hold -e "sh -c 'sleep 5; /home/benu/Downloads/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh /home/benu/Downloads/kafka_2.11-0.8.2.2/config/server.properties'" \
--tab --title="SSC" --profile Hold -e "sh -c 'sleep 15; cd ~/gitnewssc/benu-ssc-binaries; ./startSSC.sh'" --working-directory="/home/benu/gitnewssc/benu-ssc-binaries" \
--tab --title="SSC-Binaries" --profile Hold --working-directory="/home/benu/gitnewssc/benu-ssc-binaries" \
--tab --title="SSC-DB" --profile Hold --working-directory="/home/benu/SSC-V2/ssc-db"
    
por 13.02.2016 / 16:01
4

Experimente escrever \ . Então o shell ignora a próxima nova linha e você pode escrever opções em uma nova linha.

    
por 13.02.2016 / 15:56
1

Você pode fazer pequenas edições em sua ideia original com matrizes - use arrayName[number]="tab assignment" form. Aqui está, por exemplo, o que fiz na sessão de terminal interativa para abrir uma nova janela de terminal (e todas essas etapas poderiam facilmente ser transformadas em um script).

$ array[0]=" --tab --title 'Tab1' -e vi"                       

$ array[1]=" --tab --title 'Tab1' -e byobu"                    

$ gnome-terminal ${array[@]}

Genn Jackman no comentário notou corretamente que a citação pode se tornar um problema, especialmente se você tiver vários comandos difíceis, como no seu caso. Assim, convém considerar a divisão das informações para a guia e o comando real necessário para que elas sejam executadas em duas matrizes correspondentes, cada entrada da matriz por guia. Observe que queremos usar cmd[x] como uma string inteira, portanto, citando-a, enquanto tabinfo[1] precisa expandir para várias opções diferentes

Você pode considerar também colocar nomes de arquivos em variáveis como VAR=/path/to/file e usar $VAR para fazer referência a esses comandos internos em vez de ter comandos longos.

#!/bin/bash

function main()
{
   local cmd[1]="sh -c 'df;free;bash'"
   local cmd[2]="sh -c 'lsblk;cat /etc/fstab;bash'"
   local tabinfo[1]="--tab 'TAB1' --profile CRT -e"
   local tabinfo[2]="--tab 'TAB2'"
   gnome-terminal  ${tabinfo[1]} "${cmd[1]}" ${tabinfo[2]} "${cmd[2]}"
}

main
    
por 13.02.2016 / 16:44