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

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

Eu tenho um script que abre o terminal e abre 5 abas, executa um determinado comando e vai para 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"

Ter tudo em uma linha é difícil de manter. Como posso torná-lo melhor para que seja fácil de ler?

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 ainda não está funcionando! Estou aberto a qualquer sugestão que vocês possam ter para mim. Estou apenas procurando aprender e melhorar.

Responder1

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

Exemplo:

#!/bin/bash

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

executar 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"

Responder2

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

Responder3

Você pode fazer pequenas edições em sua ideia original com o arrayName[number]="tab assignment" formulário de uso de arrays. Aqui está, por exemplo, o que fiz na sessão de terminal interativo para abrir uma nova janela de terminal (e todas essas etapas podem ser facilmente 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, percebeu corretamente que citar pode se tornar um problema, especialmente se você tiver vários comandos difíceis, como no seu caso. Portanto, você pode considerar dividir as informações da guia e do comando real necessário para executar 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]temos que expandir para várias opções diferentes

Você pode querer considerar também colocar nomes de arquivos em variáveis ​​como VAR=/path/to/filee using $VARpara 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

informação relacionada