Terminal pencerelerini açan ve bunlarda komutları çalıştıran bir betiği nasıl yapabilirim?


140

Ubuntu makinemi başlattığımda çalıştırmam gereken üç komut dosyası var, geliştirme ortamımda kullandığım hizmetleri başlatıyorlar.

Bunu yapmak için manuel olarak üç terminal açtım ve komutları yazın.

Üç terminal açacak ve her birinde bir komut çalıştıracak bir komut dosyası oluşturmanın bir yolu var mı? (Her komut kendi çıkışını görebilmem için ayrı bir terminal penceresinde olmalıdır).

Yanıtlar:


138
gnome-terminal -e command

veya

xterm -e command

veya

konsole -e command

Hemen hemen

terminal -e command

Komut çıktığında terminalin kalmasını sağlamak için:

Konsole'de bir --noclosebayrak var.

Xterm'de bir -holdbayrak var.

İçinde gnome-terminal, Düzenle -> Profil Tercihleri -> Başlık . Click Komut sekmesi. Komut çıkıldığında etiketli açılır menüden Terminali Beklet'i seçin . Bunun için yeni bir profil oluşturmalı ve

gnome-terminali - pencere profili ile = NAMEOFTHEPROFILE -e komutu

1
Terminali tutmaya çalışırsam, "normal şekilde 127 durum kodu ile çocuk işleminden çıktım"
Darshan Chaudhary

2
gnome-terminal artık başlık seçeneğine sahip değil :(
törzsmókus

1
@ törzsmókus gerçekten 2017! LTS sürümleri 5 yıllık bir destek ömrüne sahiptir. 14.04
bhass1

1
gnome-terminal -e commandsadece commandalıntı yapılırsa işe yarar . Yani bu işe yaramazsa: gnome-terminal -e "echo hello world; sleep 3"ama bunu yapar: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". İç çekmek.
bgoodr

3
Ayrıca gnome-terminalini ; $SHELLkomutun sonuna ekleyerek açık tutabilirsiniz . Ör:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples

58

Bunun yerine sabit kodlama gnome-terminal, konsole, vesaire, Alternatifler sistemi kullanır. Varsayılan terminal emülatörünü çalıştıran program:

x-terminal-emulator

Sistemimde, bu komutu her çalıştırdığımda Konsole'nin yeni bir örneğini açıyor.

Neyse ki, terminaller -ebir komut çalıştırma seçeneğini destekliyor gibi görünüyor ( konsoleve doğruladım gnome-terminal). Komuttan sonraki argümanlar invoked komutuna iletilir. Bash terminalimde açık kalmayı reddediyor, terminal almak için ek bir komut dosyası gerekiyor:

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

Önceki komut dosyasını olduğu gibi kaydettiyseniz /home/user/hackyve çalıştırılabilir hale getirdiyseniz, komut dosyalarınızı şu şekilde çalıştırırsınız:

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

Tam yol gerekli ve /home/user/hackyçalıştırılabilir olması gerekiyor.

Yeni bir terminal penceresinde bir komut dosyası çalıştırma girişimi revizyon # 2'de bulunabilir , bu önce argümanların iletilebileceğini fark etmeden önceydi x-terminal-emulator.


Bu durumda, asker tüm terminaller için aynı olmayan bir şey yapmak istediğinden fazla faydası olmaz.
nickguletskii

Deneme # 3: bu terminali açık tutmalı ve programı isteğe bağlı argümanlarla çalıştırmalıdır.
Lekensteyn

1
Gnome seçeneğini kullandım, ancak senaryomu çalıştırdığımda ana terminal kapanıyor !! .. neden herhangi bir fikrin var mı?
McLan

3
@ Suda.nese Bu, tasarım gereği, "terminal" komut dosyası çalıştırıldığında yapıldığında, daha sonra yapacak başka bir şey olmadığı için bırakılacaktır. Commands ( bash) komutunu çalıştırabileceğiniz veya bunun gibi bir satırın olduğu bir kabuğu çalıştırarak bunu "düzeltebilirsiniz" read -p "Press Return to continue".
Lekensteyn

1
Terminalde birden fazla komutu nasıl çalıştırabilirsiniz? Örneğin cd xxx && start.sh. Tercüman, && komutunun ikinci kısmı olarak görür (mantıklı olan), ama eğer alıntı yaparsam, her şeyi büyük bir argüman olarak yürütmeye çalışır
Richard

9

Oldukça basit-

#!/bin/bash

/etc/init.d/ccpd status

Bu, terminalde hiçbir şey göstermesi gerekmeyen diğer komutlar için yeterlidir. Ancak burada görüntülenen durumu görmek gerekiyor.
Yani, bir terminal penceresinde çalıştırmak gerekiyor

#!/bin/bash

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

Yer[] tutucu olması amaçlanan diğer gönderi

Burada "NAMEOFTHEPROFILE", "komuttan çıktığında terminali tutan" profilin adıyla değiştirilecektir.

görüntü tanımını buraya girin

görüntü tanımını buraya girin


1
@cipricus inanıyorum ki []sadece yer tutucuydu
Karthik T

anladım. ama terminalin bu kadar hızlı kapanmamasını sağlamalıyım. sanırım bu da bağlantılı bir sorunda

@cipricus bir profili denedin mi? Sadece eklemem gerekiyor --window-with-profile=NAMEOFTHEPROFILEben verdik ne
Karthik T

1
@cipricus Daha iyi talimatlar vermek için eve geri dönmem gerekiyor, ancak fikir bu seçenekle özel bir profil oluşturmak ve yukarıdaki yerdeki özel profilin adını kullanmak.
Karthik T

2
@cipricus bu sizin için yeterliyse, o zaman tamam. Profil, bir grup ayardan başka bir şey değildir. Ayarları SADECE kodunuzda kullanmak için ayarlayabilir ve tüm terminallerde kullanmanız gerekmez. Sahip olduğunuz tüm profilleri görmek için Düzenle -> Profiller'i görebilir ve oraya bağladığınız
gönderide

5

Tarafından Destekli @ nickguletskii cevabı benim yorumun @ grabantot en upvote tarafından ve onun cevabını altında kendi yorumlayın ve ilham burada terminali bu yüzden daha sonra elle kullanabilirsiniz açık kalmak isteyen, özellikle bunu yapmak benim tercih yoludur.

Ör. kullanım: bu, başlangıç ​​programlarınıza eklemek için gerçekten yararlıdır; bu komut dosyası çalışacak, bir terminal açacak, terminalde bir sekme oluşturacak ve adlandıracak ve sizin için bir komut çalıştıracaktır. Veya bu betiğe masaüstünüze bir sembol link ekleyebilirsiniz. Bu tür bir yaklaşımı kullanıyorum, böylece masaüstümdeki tek bir simgeye çift tıklayabiliyorum ve birkaç terminali açmamı sağladım (bunlarda yapacağım işe göre adlandırılmış çeşitli sekmelerle) ve kurulum programları programlama ortamım, örneğin günlük işler için.

İşte tek bir sekme açan, "test" olarak adlandırılan ve daha sonra cd /etc; lsiçindeki basit komutu çalıştıran tartışmalı bir örnek . Son $SHELLkısım, kabuğu açık kalmaya zorlar, böylece çıktısını görebilir ve kullanmaya devam edebilirsiniz (Bunu Stack Overflow'ta başka bir yerde öğrendim):

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

İşte aynı gnome-terminalinde 3 ayrı sekme açan daha karmaşık bir örnek. Bu, tam olarak masaüstü kısayolumun yaptığı bir şeydir, böylece aynı anda bir sürü programlama penceresi açabilirim:

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'"

İşte yukarıdaki komutun bir dökümü:

  • gnome-terminal = bir gnome-terminali aç
  • --tab = Bir sonraki adım için benzersiz bir sekme aç
  • --title="tab 1" = bu sekme başlığı "sekme 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= bash -c 'cd /etc; ls; $SHELL'sadece örnek olarak yaptığım bir komut olan komutu çalıştırın ; İşte ne yapar:
    • bash -c bash 'c'ommand olduğunu söylüyor
    • cd /etc = 'c'hange' d'irectory "/ etc" yoluna
    • ls = 'Ben bu dizinin içeriği değil
    • $SHELL= Bu şifreli tidbit kabuğu açık tutmak için gereklidir, böylece onunla çalışabilirsiniz. Kabuğun açılmasını istiyorsanız, komutunuzu çalıştırın, sonra kapatın, sadece bu kısmı kaldırın. Ancak, sekmenin açık kalmasını istiyorum böylece programlama sihrini yapabilirim. :)
  • daha sonra --tabsekme 2'yi üretmek için tekrar baştan , sonra sekme 3 için tekrar başlıyoruz .

Ekran görüntüsü:

görüntü tanımını buraya girin


1
yardımcı olduğuma sevindim) Ben de sadece tıklayabildiğim ve projede çalışmaya başlayabileceğim senaryolarım var. Onlarla ilgili iki sorun vardı: birçok terminal penceresi (onlar için ayrı bir ekran vardı) ve örneğin sunucu çöktülerinde kapanan pencereler. Bu cevap her iki problemimi de çözüyor - --tab + $ SHELL. Nice
grabantot

1

Lekensteyn'in cevabına yorum yaptı. Bunun eski bir gönderi olduğunu biliyorum, ancak bunu faydalı bulmuş olan herkes için (az önce yaptığım gibi), aradığınız betiğin içine bir işlev koyan başka bir "sahte senaryo" yapmak yerine

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

Komut dosyanızı "x-terminal-emulator -e / path / to / script hacky_function isteğe bağlı argümanları burada" ile çağırın

Komutun sonuna "$ @" eklemeyi unutmayın


-2

Kullan ekran komutunu ve varolan ekran oturumundan ayırmak -D, ve yeni bir ekran oturumu zorlamak -M burada tekrar takın -S adlandırılmış oturumu oluşturmak yerine varsayılan adını kullanarak


Bu cevap hiç açık değil, lütfen daha anlaşılır hale getirmeye özen
gösterin

aslında @azerafati, ekran herhangi bir terminal penceresi
açmıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.