Otwieranie wielu kart terminali i uruchamianie polecenia

9

Muszę otworzyć wiele kart terminali, nadać im tytuły, przejść do katalogu i sprawić, by każda karta uruchomiła polecenie.

Jestem nowy w Linuksie i skryptach powłoki, po przeszukaniu Internetu i sprawdzeniu niektórych rozwiązań, stworzyłem ten skrypt ( EDYTOWANY na podstawie poniższych odpowiedzi):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Otwiera karty, nazywa je, ale nie wykonuje poleceń generujących ten błąd:

Wystąpił błąd podczas tworzenia procesu potomnego dla tego terminala

Kolejną wadą jest to, że jeśli zatrzymam uruchomione polecenie, zamyka kartę, czego nie chcę. Muszę być w stanie zatrzymać polecenie i uruchomić je ponownie w tej samej zakładce.

Co jest nie tak ze skryptem? Czy istnieje inny prostszy sposób to zrobić?

Uwaga: Jeśli usunę część (-e "\" bash -c $ {cmds [i]}; bash \ "") z polecenia, otwiera zakładki w danym katalogu i nadaje im nazwy, bez błędów.

-Edytuj-1:

Po zastosowaniu poniższej odpowiedzi @Tuknutx i edycji skryptu błąd już się nie pojawia, ale daje mi bash: rails c: command not foundi rails stworzy nową aplikację railsową zamiast uruchamiania serwera, używam .rmvrc do wybrania zestawu gem po uzyskaniu dostępu do tego folderu .

Brary
źródło
Jeśli chcesz, aby skrypt działał na starcie systemu Ubuntu: - możesz uruchomić skrypt jako usługę upstart ( help.ubuntu.com/community/UbuntuBootupHowto ) lub: używając „aplikacji startowych” w środowisku pulpitu
Aboelnour
jeśli piszę cmds[1]="'ping 192.168.9.9'", pojawia się ten sam błąd, ale rozwiązałem go, usuwając pojedynczy cytat. Więc jeśli napiszę, cmds[1]="ping 192.168.9.9"to działa.
stokrotka
@Brary, ale nie rozumiem, dlaczego otwiera trzy karty - jedną domyślną i dwie inne ustawione w skrypcie. Ponieważ definiujemy tab=" --tab-with-profile=Default"?
stokrotka

Odpowiedzi:

3

Polecam używać tmuxz tmuxinator, zrobi to za Ciebie i możesz polegać również na terminatorukładach!

W celu terminatorsprawdzenia układu odpowiedź mhnagaoka tutaj również askubuntu:

  1. Po skonfigurowaniu układu kliknij prawym przyciskiem myszy dowolne tło terminala i wybierz Preferencje → karta Układy , a następnie kliknij przycisk Dodaj .

  2. Nadaj mu nazwę i naciśnij Zamknij .

  3. To powinno utworzyć wspomniany ~/.config/terminator/configplik.

  4. Teraz możesz uruchomić terminator przy użyciu zapisanego układu, używając: terminator -l yourLayout(zamień swój układ na dowolny, który wybrałeś w kroku 2).

  5. (opcjonalnie) Edytuj ~/.config/terminator/configplik, tak aby tam, gdzie jest napisane [layouts]i zagnieżdżony pod nim [[yourLayout]], zmień nazwę swojego Układu na domyślny i usuń / zmień nazwę poprzedniego domyślnego układu. Teraz, gdy Terminator uruchomi się bez żadnych parametrów, załaduje własny [[default]]układ!

Islam Azab
źródło
2

Podsumowując kilka innych odpowiedzi i ich komentarzy, oto, z czym skończyłem:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Pamiętaj, że zabrałem kartę „wzorcową”, profile i tytuły (które wydają się być nieaktualne gnome-terminal).

Ian Hincks
źródło
Dane wyjściowe $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.„Użyj„ - ”, aby zakończyć opcje i ustawić wiersz polecenia do wykonania po nim. . that's an output but the comands get executed. When i use $ tab - `polecenie nie jest wykonywane, a terminal dsisplay:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee
1

Spróbuj tego:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

w przeciwnym razie całe wyrażenie po -e będzie interpretowane jako polecenie.

Aby dołączyć aliasy z .bashrc użyj -iczamiastc

TuKsn
źródło
Błąd już się nie pojawia, dzięki. Daje mi to, bash: rails c: command not founda „rails s” tworzy nową aplikację railsową zamiast uruchamiać serwer railsowy. Zmienia to zakres pytania, zmodyfikuję je wraz z modyfikacją skryptu
Brary
Czy działało, jeśli próbujesz rails cna terminalu bez niczego innego? Może powinno być rails -c?
TuKsn
Próbowałem, że to nie zadziałało. Nawet próbowałem rvm list gemsetsi mówi No command 'rvm' found... uruchom to samo polecenie rvm list gemsetsw pierwszej karcie, która otwiera się bez uruchamiania polecenia i zadziałało! czy uruchamia polecenie przed załadowaniem środowiska i załadowaniem pliku .rvmrc?
Brary,
1

Argument, który podajesz opcji -e, "bash -c command; bash"obejmuje cytaty. Interpretuje cały ciąg jako nazwę polecenia! Spróbuj to zamiast: -e "bash -c 'command ; bash'". W ten sposób uruchamiane jest okno terminala command, a po tym dostajesz powłokę córki, która, jak zakładam, jest tym, czego chcesz. Nawiasem mówiąc, możesz także powiedzieć 'command & bash'; uruchomi to polecenie w tle i od razu da ci powłokę córki.

Silvio Levy
źródło
Zmieniłem to options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )na options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )i dał mi ten sam błąd .. czy robię to dobrze?
Brary,
Niezupełnie poprawne: usuń \ ”przed pierwszym uderzeniem i \” po „po drugim uderzeniu.
Silvio Levy,
Dzięki, zredagowałem pytanie i zmieniłem jego zakres, aby zawierał szyny i rvm.
Brary,