Comment améliorer le script bash depuis une longue ligne vers une meilleure méthode?

J'ai un script qui ouvre le terminal et ouvre 5 tabs, exécute une certaine command, et va dans un certain directory de travail.

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

entrer la description de l'image ici

Avoir tout en une seule ligne est difficile à maintenir. Comment est-ce que je le rende meilleur pour qu'il soit facile à lire?

J'ai essayé

 #!/bin/sh Tab="" Tab+=("--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+=( "--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+=(" --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+=(" --tab --title='SSC-Binaries' --profile Hold --working-directory='/home/benu/gitnewssc/benu-ssc-binaries'") Tab+=(" --tab --title='SSC-DB' --profile Hold --working-directory='/home/benu/SSC-V2/ssc-db'") # echo "${Tab[@]}" gnome-terminal "${Tab[@]}" exit 0 

Jusqu'à présent, ça ne marche pas encore! Je suis ouvert à toutes les suggestions que vous pourriez avoir pour moi. Je cherche juste à apprendre et à l'améliorer.

Merci,

Vous pouvez utiliser \ pour split les longues commands sur plusieurs lignes.

Exemple:

 #!/bin/bash echo "Hello World!" echo \ "Hello World!" 

l'exécution de ce script entraîne

 $ ./test.sh Hello World! Hello World! 

Dans votre cas, vous pouvez utiliser quelque chose comme

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

Essayez-le en écrivant \ . Ensuite, le shell ignore la nouvelle ligne suivante et vous pouvez écrire des options dans une nouvelle ligne.

Vous pouvez créer de petites modifications à votre idée originale avec des arrays – utilisez arrayName[number]="tab assignment" form. Voici par exemple ce que j'ai fait dans la session du terminal interactif pour ouvrir une nouvelle window de terminal (et toutes ces étapes pourraient facilement être transformées en un script).

 $ array[0]=" --tab --title 'Tab1' -e vi" $ array[1]=" --tab --title 'Tab1' -e byobu" $ gnome-terminal ${array[@]} 

Genn Jackman dans le commentaire remarqué correctement que la citation peut devenir un problème surtout si vous avez plusieurs commands difficiles comme dans votre cas. Par conséquent, vous pouvez envisager de fractionner les informations de l'onglet et la command réelle dont il a besoin pour s'exécuter dans deux arrays correspondants, chaque input de tableau par onglet. Notez que nous voulons utiliser cmd[x] comme une string entière, donc en la citant, tandis que tabinfo[1] doit être étendu à plusieurs options différentes

Vous pouvez également envisager de placer des noms de files dans des variables comme VAR=/path/to/file et d'utiliser $VAR pour referencer ces commands internes au lieu d'avoir de longues commands.

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