Ich habe ein Skript, das das Terminal öffnet, fünf Registerkarten öffnet, einen bestimmten Befehl ausführt und zu einem bestimmten Arbeitsverzeichnis geht.
#!/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"
Es ist schwierig, alles in einer Zeile zu haben. Wie kann ich es besser machen, damit es leichter zu lesen ist?
ich habe es versucht
#!/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
Bisher funktioniert es noch nicht! Ich bin offen für alle Vorschläge, die ihr für mich habt. Ich möchte einfach lernen und es verbessern.
Antwort1
Sie können verwenden \
, um lange Befehle auf mehrere Zeilen aufzuteilen.
Beispiel:
#!/bin/bash
echo "Hello World!"
echo \
"Hello World!"
Das Ausführen dieses Skripts führt zu
$ ./test.sh
Hello World!
Hello World!
In Ihrem Fall können Sie so etwas verwenden wie
#!/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"
Antwort2
Versuchen Sie es mit writing \
. Dann ignoriert die Shell die nächste neue Zeile und Sie können Optionen in eine neue Zeile schreiben.
Antwort3
Sie können Ihre ursprüngliche Idee mit Arrays geringfügig ändern – verwenden Sie arrayName[number]="tab assignment"
das Formular. Hier sehen Sie beispielsweise, was ich in einer interaktiven Terminalsitzung getan habe, um ein neues Terminalfenster zu öffnen (und alle diese Schritte könnten problemlos in ein Skript umgewandelt werden).
$ array[0]=" --tab --title 'Tab1' -e vi"
$ array[1]=" --tab --title 'Tab1' -e byobu"
$ gnome-terminal ${array[@]}
Genn Jackman hat in seinem Kommentar richtig bemerkt, dass Anführungszeichen ein Problem darstellen können, insbesondere wenn Sie wie in Ihrem Fall mehrere schwierige Befehle haben. Daher sollten Sie die Informationen für die Registerkarte und den eigentlichen Befehl, der ausgeführt werden muss, in zwei entsprechende Arrays aufteilen, wobei jeder Array-Eintrag pro Registerkarte erfolgt. Beachten Sie, dass wir cmd[x]
als eine ganze Zeichenfolge verwenden möchten, daher in Anführungszeichen setzen, während tabinfo[1]
in mehrere verschiedene Optionen erweitert werden muss
Möglicherweise möchten Sie auch Dateinamen in Variablen wie platzieren VAR=/path/to/file
und diese verwenden, $VAR
um innerhalb von Befehlen auf diese zu verweisen, anstatt lange Befehle zu verwenden.
#!/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