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/file
y usar $VAR
para 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