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/file
e using $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