Membuka banyak tab terminal dan menjalankan perintah

9

Saya perlu membuka banyak tab terminal, memberi mereka judul, pergi ke direktori, dan membuat setiap tab menjalankan perintah.

Saya baru mengenal Linux dan skrip shell, setelah mencari secara online dan memeriksa beberapa solusi, saya membuat skrip ini ( Diedit berdasarkan jawaban di bawah):

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

Ini membuka tab, menamai mereka, tetapi gagal menjalankan perintah yang menghasilkan kesalahan ini:

Terjadi kesalahan saat membuat proses anak untuk terminal ini

Kelemahan lain adalah bahwa jika saya menghentikan perintah yang sedang berjalan itu menutup tab, yang saya tidak mau. Saya harus dapat menghentikan perintah dan menjalankannya lagi di tab yang sama.

Apa yang salah dengan skrip? Apakah ada cara lain yang lebih sederhana untuk melakukan itu?

Catatan: Jika saya menghapus bagian (-e "\" bash -c $ {cmds [i]}; bash \ "") dari perintah, ia membuka tab di direktori yang diberikan dan menamainya, tanpa kesalahan.

-Edit-1:

Setelah menerapkan @Tuknutx jawaban di bawah ini dan mengedit skrip, kesalahan tidak muncul lagi, tetapi itu memberi saya bash: rails c: command not founddan rails smembuat aplikasi rel baru alih-alih memulai server rel, saya menggunakan .rmvrc untuk memilih permata setelah folder ini diakses .

Brary
sumber
Jika Anda ingin membuat skrip Anda berjalan di boot Ubuntu: - Anda dapat menjalankan skrip Anda sebagai layanan pemula ( help.ubuntu.com/community/UbuntuBootupHowto ) atau: menggunakan "aplikasi startup" di lingkungan desktop Anda
Aboelnour
jika saya menulis cmds[1]="'ping 192.168.9.9'"itu memberi saya kesalahan yang sama tetapi saya menyelesaikannya dengan menghapus kutip tunggal. Jadi jika saya tulis cmds[1]="ping 192.168.9.9"itu berfungsi.
Daisy
@Brary tapi saya tidak mengerti mengapa ini membuka tiga tab-satu default dan dua lainnya yang diatur dalam skrip. Karena kita mendefinisikan tab=" --tab-with-profile=Default"??
Daisy

Jawaban:

3

Saya akan merekomendasikan menggunakan tmuxdengan tmuxinator, itu akan melakukan pekerjaan untuk Anda, dan Anda dapat mengandalkan terminatortata letak juga!

Untuk terminatorcheckout tata letak jawaban mhnagaoka di sini askubuntu juga:

  1. Setelah mengatur tata letak Anda, klik kanan pada latar belakang terminal apa saja dan pilih Preferensi → tab Tata Letak dan klik tombol Tambah .

  2. Beri nama dan tekan Tutup .

  3. Ini harus membuat ~/.config/terminator/configfile yang disebutkan .

  4. Sekarang Anda dapat memulai terminator menggunakan tata letak yang disimpan menggunakan: terminator -l yourLayout(ganti YourLayout dengan apa pun yang Anda pilih pada langkah 2).

  5. (opsional) Edit ~/.config/terminator/configfile sehingga di mana dikatakan [layouts]dan bersarang di bawahnya [[yourLayout]], ganti nama Layout Anda menjadi default dan hapus / ubah nama tata letak default sebelumnya . Sekarang, ketika Terminator mulai tanpa parameter, itu akan memuat [[default]]tata letak khusus Anda !

Islam Azab
sumber
2

Untuk merangkum beberapa jawaban lain dan komentar mereka, inilah yang akhirnya saya sampaikan:

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

Perhatikan bahwa saya mengambil tab 'master', dan profil, dan judul (yang tampaknya sudah usang gnome-terminal).

Ian Hincks
sumber
Output dari $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.`Use“ - ”untuk mengakhiri opsi dan menempatkan baris perintah untuk mengeksekusi setelahnya. . that's an output but the comands get executed. When i use $ tab - `perintah tidak dieksekusi dan terminal dsisplays: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

Coba ini:

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

jika tidak seluruh ekspresi setelah -e akan ditafsirkan sebagai perintah.

Untuk memasukkan alias dari penggunaan .bashrc -icalih-alihc

TuKsn
sumber
Kesalahan tidak muncul lagi, terima kasih. Tapi itu memberi saya bash: rails c: command not founddan 'rails' menciptakan aplikasi rail baru alih-alih memulai server rails. Ini mengubah ruang lingkup pertanyaan, saya akan mengeditnya dengan modifikasi skrip Anda
Brary
Apakah berhasil jika Anda mencoba rails cterminal tanpa yang lain? Mungkin seharusnya begitu rails -c?
TuKsn
Mencoba itu tidak berhasil. Saya bahkan mencoba rvm list gemsetsdan dikatakan No command 'rvm' found.. jalankan perintah yang sama rvm list gemsetsdi tab pertama yang terbuka tanpa menjalankan perintah dan itu berhasil! apakah itu menjalankan perintah sebelum lingkungan memuat dan file .rvmrc dimuat?
Brary
1

Argumen yang Anda berikan opsi -e adalah "bash -c command; bash"termasuk tanda kutip. Itu mengartikan seluruh string sebagai nama perintah! Coba ini sebagai gantinya: -e "bash -c 'command ; bash'". Dengan cara ini apa yang dijalankan pada jendela terminal Anda command, dan setelah itu berjalan, Anda akan diberi shell anak, yang saya asumsikan adalah yang Anda inginkan. Kebetulan, Anda juga bisa mengatakan 'command & bash'; ini akan menjalankan perintah di latar belakang dan memberi Anda shell putri segera.

Silvio Levy
sumber
Saya mengubah ini options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )menjadi options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )dan itu memberi saya kesalahan yang sama .. apakah saya melakukannya dengan benar?
Brary
Tidak cukup benar: hapus \ "sebelum bash pertama dan \" setelah 'setelah bash kedua.
Silvio Levy
Terima kasih, saya mengedit pertanyaan dan mengubah cakupannya untuk memasukkan rel dan rvm.
Brary