¿Cómo mejorar las secuencias de comandos bash de 1 línea larga a un método mejor?

¿Cómo mejorar las secuencias de comandos bash de 1 línea larga a un método mejor?

Tengo un script que abre la terminal y abre 5 pestañas, ejecuta un comando determinado y va a un directorio de trabajo determinado.

#!/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"

Tener todo en una sola línea es difícil de mantener. ¿Cómo puedo mejorarlo para que sea fácil de leer?

He intentado

#!/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

¡Hasta ahora todavía no funciona! Estoy abierto a cualquier sugerencia que puedan tener para mí. Solo busco aprender y mejorarlo.

Respuesta1

Puede utilizarlo \para dividir comandos largos en varias líneas.

Ejemplo:

#!/bin/bash

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

ejecutar este script da como resultado

$ ./test.sh 

Hello World!
Hello World!

En tu caso puedes 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"

Respuesta2

Pruébelo con la escritura \. Luego, el shell ignora la siguiente línea nueva y puede escribir opciones en una línea nueva.

Respuesta3

Podrías hacer una pequeña edición a tu idea original con matrices: usa arrayName[number]="tab assignment" el formulario. Esto es, por ejemplo, lo que hice en una sesión de terminal interactiva para abrir una nueva ventana de terminal (y todos estos pasos podrían convertirse fácilmente en un script).

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

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

$ gnome-terminal ${array[@]}

Genn Jackman en el comentario notó correctamente que las citas pueden convertirse en un problema, especialmente si tiene varios comandos difíciles, como en su caso. Por lo tanto, es posible que desee considerar dividir la información de la pestaña y el comando real que necesita para ejecutarse en dos matrices correspondientes, cada entrada de la matriz por pestaña. Tenga en cuenta que queremos usarla cmd[x]como una cadena completa, por lo tanto, la citamos, mientras que tabinfo[1]tenemos que expandirla a varias opciones diferentes.

Es posible que desee considerar también colocar nombres de archivos en variables como VAR=/path/to/filey usar $VARpara hacer referencia a esos comandos internos en lugar de tener comandos largos.

#!/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

información relacionada