У меня есть скрипт, который открывает терминал и 5 вкладок, выполняет определенную команду и переходит в определенный рабочий каталог.
#!/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"
Сложно поддерживать все в одной строке. Как сделать так, чтобы было легче читать?
я пробовал
#!/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
Пока что это не работает! Я открыт для любых предложений, которые вы можете мне предложить. Я просто хочу изучить и улучшить это.
решение1
Вы можете использовать \
его для разделения длинных команд на несколько строк.
Пример:
#!/bin/bash
echo "Hello World!"
echo \
"Hello World!"
запуск этого скрипта приводит к
$ ./test.sh
Hello World!
Hello World!
В вашем случае вы можете использовать что-то вроде
#!/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"
решение2
Попробуйте написать \
. Тогда оболочка проигнорирует следующую новую строку, и вы сможете написать опции в новой строке.
решение3
Вы можете внести небольшие изменения в свою первоначальную идею с массивами - используйте arrayName[number]="tab assignment"
форму. Вот, например, что я сделал в интерактивной терминальной сессии, чтобы открыть новое терминальное окно (и все эти шаги можно легко превратить в скрипт).
$ array[0]=" --tab --title 'Tab1' -e vi"
$ array[1]=" --tab --title 'Tab1' -e byobu"
$ gnome-terminal ${array[@]}
Genn Jackman в комментарии правильно заметил, что кавычки могут стать проблемой, особенно если у вас есть несколько сложных команд, как в вашем случае. Таким образом, вы можете рассмотреть возможность разделения информации для вкладки и фактической команды, которую она должна запустить, на два соответствующих массива, каждая запись массива на вкладку. Обратите внимание, что мы хотим использовать cmd[x]
как одну целую строку, поэтому заключаем ее в кавычки, в то время как tabinfo[1]
has to expand to несколько различных вариантов
Вы также можете рассмотреть возможность помещения имен файлов в переменные, например, VAR=/path/to/file
и использования $VAR
их для ссылки на них внутри команд вместо создания длинных команд.
#!/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