Bagaimana saya bisa membuat skrip yang membuka jendela terminal dan menjalankan perintah di dalamnya?

140

Saya memiliki tiga skrip yang harus saya jalankan ketika saya memulai mesin Ubuntu saya, mereka memulai layanan yang saya gunakan di lingkungan pengembangan saya.

Untuk melakukan itu, saya secara manual membuka tiga terminal dan mengetikkan perintah.

Apakah ada cara untuk membuat skrip yang akan membuka tiga terminal dan menjalankan satu perintah di masing-masing terminal? (Setiap perintah harus di jendela terminal terpisah sehingga saya bisa melihat hasilnya).

JSBach
sumber

Jawaban:

138
gnome-terminal -e command

atau

xterm -e command

atau

konsole -e command

Kurang lebih

terminal -e command

Untuk membuat terminal tetap ketika perintah keluar:

Di konsole ada --noclosebendera.

Di xterm, ada -holdbendera.

Di gnome-terminal, buka Edit -> Preferensi Profil -> Judul . Klik tab Command . Pilih Pegang terminal dari menu drop-down berlabel Ketika perintah keluar . Anda harus membuat profil baru untuk itu dan mengeksekusi dengan

gnome-terminal --window-with-profile = NAMEOFTHEPROFILE -e perintah
nickguletskii
sumber
1
Jika saya mencoba untuk memegang terminal, saya mendapatkan "proses anak keluar secara normal dengan kode status 127"
Darshan Chaudhary
2
gnome-terminal tidak memiliki opsi judul lagi :(
törzsmókus
1
@ törzsmókus, ini memang 2017! Rilis LTS memiliki masa dukungan 5 tahun. 14,04 tidak berakhir sampai April 2019. wiki.ubuntu.com/Releases
bhass1
1
gnome-terminal -e commandhanya berfungsi jika commanddikutip. Jadi ini tidak bekerja: gnome-terminal -e "echo hello world; sleep 3"tapi ini tidak: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Mendesah.
bgoodr
3
Anda juga dapat menahan terminal gnome terbuka dengan menambahkan ; $SHELLdi akhir perintah. Contoh:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples
58

Alih-alih keras-coding gnome-terminal, konsole, dan sebagainya, menggunakan sistem Alternatif. Program yang menjalankan emulator terminal default adalah:

x-terminal-emulator

Di sistem saya, itu membuka contoh baru Konsole setiap kali saya menjalankan perintah ini.

Untungnya, terminal tampaknya mendukung -eopsi untuk mengeksekusi suatu perintah (saya memverifikasi untuk konsoledan gnome-terminal). Argumen setelah perintah diteruskan ke perintah yang dipanggil. Bash menolak untuk tetap terbuka di terminal saya, skrip tambahan diperlukan untuk mendapatkan terminal:

#!/bin/sh
"$@"
exec "$SHELL"

Jika Anda menyimpan skrip sebelumnya sebagai /home/user/hackydan membuatnya dapat dieksekusi, Anda akan menjalankan skrip Anda dengan:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

Jalur lengkap diperlukan dan /home/user/hackyharus dapat dieksekusi.

Upaya saya sebelumnya untuk menjalankan skrip di jendela terminal baru dapat ditemukan di revisi # 2 , sebelum saya menyadari argumen dapat diteruskan ke x-terminal-emulator.

Lekensteyn
sumber
Dalam hal ini, itu tidak akan banyak membantu karena penanya ingin melakukan sesuatu yang tidak sama untuk semua terminal.
nickguletskii
Percobaan # 3: yang ini harus menjaga terminal tetap terbuka dan menjalankan program dengan argumen opsional.
Lekensteyn
1
Saya menggunakan opsi gnome, namun, begitu saya menjalankan skrip saya, terminal utama ditutup !! .. tahu kenapa?
McLan
3
@ Suda.nese Yaitu dengan desain, ketika "terminal" selesai mengeksekusi skrip akan berhenti karena tidak ada lagi yang bisa dilakukan. Anda dapat "memperbaiki" ini dengan menggunakan shell di mana Anda dapat menjalankan perintah ( bash) atau memiliki baris seperti read -p "Press Return to continue".
Lekensteyn
1
Bagaimana Anda bisa menjalankan lebih dari satu perintah di terminal? Sebagai contoh cd xxx && start.sh. Penerjemah melihat && sebagai bagian kedua dari perintah (yang logis), tetapi jika saya mengutipnya, maka ia mencoba mengeksekusi semuanya sebagai satu argumen besar
Richard
9

Cukup sederhana-

#!/bin/bash

/etc/init.d/ccpd status

Ini cukup untuk perintah lain yang tidak perlu menampilkan apa pun di terminal. Tapi di sini kita harus melihat status yang ditampilkan.
Jadi, perlu dijalankan di jendela terminal

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

Pos lainnya dimaksudkan []untuk menjadi penampung

Di sini "NAMEOFTHEPROFILE" harus diganti dengan nama profil yang "Memegang terminal ketika perintah keluar".

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Karthik T
sumber
1
@cipricus yang saya yakini []hanyalah placeholder
Karthik T
mengerti. tetapi saya harus membuat terminal tidak menutup begitu cepat. Saya kira itu juga dalam pertanyaan terkait
@cipricus, sudahkah Anda mencoba profil? Hanya perlu menambah --window-with-profile=NAMEOFTHEPROFILEapa yang telah saya berikan
Karthik T
1
@cipricus Saya harus kembali ke rumah untuk memberikan instruksi yang lebih baik, tetapi idenya adalah membuat profil khusus dengan set pilihan itu, dan menggunakan nama profil khusus di tempat di atas.
Karthik T
2
@cipricus jika itu cukup untuk Anda, maka itu tidak masalah. Profil tidak lebih dari sekelompok pengaturan. Anda dapat mengatur pengaturan HANYA untuk digunakan dalam skrip Anda, dan tidak harus menggunakannya di semua terminal. Anda dapat melihat Edit -> Profil untuk melihat semua profil yang Anda miliki, dan Anda akan menambahkan satu di sana yang diatur seperti yang dijelaskan dalam pos yang Anda
tautkan
5

Dibantu oleh jawaban @ nickguletskii , dan komentar saya sendiri di bawah jawabannya, dan terinspirasi oleh upvote @ grabantot atas komentar saya, inilah cara pilihan saya untuk melakukannya, terutama ketika saya ingin terminal tetap terbuka sehingga saya kemudian dapat menggunakannya secara manual.

Ex. penggunaan: ini sangat berguna untuk ditambahkan ke program startup Anda sehingga skrip ini akan berjalan, buka terminal, buat dan beri nama tab di terminal, dan jalankan perintah untuk Anda. Atau, Anda bisa menambahkan symlink ke skrip ini ke desktop Anda. Saya menggunakan jenis pendekatan ini sehingga saya dapat mengklik dua kali ikon tunggal di desktop saya dan membuatnya membuka banyak terminal (dengan berbagai tab yang dinamai sesuai dengan pekerjaan yang akan saya lakukan di dalamnya) dan program untuk mengatur lingkungan pemrograman saya, misalnya, untuk pekerjaan sehari-hari.

Berikut adalah contoh yang dibuat, yang membuka satu tab, judul itu "test", kemudian jalankan perintah sederhana cd /etc; lsdi dalamnya. Bagian $SHELLdi akhir memaksa shell untuk tetap terbuka sehingga Anda dapat melihat outputnya dan terus menggunakannya (saya mempelajari ini di tempat lain di Stack Overflow):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Inilah contoh yang lebih rumit yang membuka 3 tab terpisah di terminal gnome yang sama. Ini adalah jenis hal yang dilakukan pintasan desktop saya sehingga saya dapat membuka banyak jendela pemrograman sekaligus:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Berikut ini rincian perintah di atas:

  • gnome-terminal = membuka terminal gnome
  • --tab = buka tab unik untuk apa yang terjadi selanjutnya
  • --title="tab 1" = beri judul tab ini "tab 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= jalankan bash -c 'cd /etc; ls; $SHELL'perintah, yang merupakan perintah yang baru saja saya buat sebagai contoh; inilah fungsinya:
    • bash -c mengatakan itu adalah perintah bash '
    • cd /etc = 'c'hange' d'irectory ke jalur "/ etc"
    • ls = 'Bukan konten dari direktori ini
    • $SHELL= berita gembira rahasia ini diperlukan untuk menjaga shell terbuka sehingga Anda dapat bekerja dengannya. Jika Anda ingin shell terbuka, jalankan perintah Anda, lalu tutup, cukup hapus bagian ini. Namun, saya ingin agar tab tetap terbuka sehingga saya bisa membuat keajaiban pemrograman. :)
  • kami kemudian mulai kembali pada --tabbagian untuk menghasilkan tab 2, lalu lagi untuk tab 3. Sesuaikan dengan isi hati Anda.

Tangkapan layar:

masukkan deskripsi gambar di sini

Gabriel Staples
sumber
1
senang saya sangat membantu) Saya juga punya skrip yang bisa saya klik dan mulai mengerjakan proyek. Ada dua masalah dengan mereka: banyak jendela terminal (memiliki seluruh layar terpisah untuk mereka) dan jendela menutup setelah server crash misalnya. Jawaban itu memecahkan kedua masalah saya dengan --tab + $ SHELL. Nice
grabantot
1

mengomentari jawaban oleh Lekensteyn. Saya tahu ini adalah posting lama, tetapi bagi siapa saja yang menganggap ini berguna (seperti yang baru saja saya lakukan) Alih-alih membuat "skrip hack" yang lain dengan hanya meletakkan fungsi di dalam skrip yang Anda panggil

hacky_function()
{
"$@"
exec "$SHELL"
}

Panggil skrip Anda dengan "argumen opsional x-terminal-emulator -e / path / ke / script hacky_function di sini"

Jangan lupa letakkan "$ @" di akhir skrip

Sruli
sumber
-2

Gunakan perintah layar dan -d lepas dari sesi layar yang ada, dan pasang kembali di sini -m memaksakan sesi layar baru -S membuat sesi bernama daripada menggunakan nama default

Jack Heath
sumber
jawaban ini tidak jelas sama sekali, tolong buat lebih dimengerti
azerafati
@azerafati memang, layar tidak membuka jendela terminal apa pun ... bahkan tidak dimaksudkan oleh paket yang luar biasa ...
erm3nda