GNOME terminalini programatik olarak açın ve bashrc çalıştırıldıktan sonra komutları yürütün.


35

Dev ortamımı başlatmak için küçük bir senaryo yazdım. Bir kısım, otomatik olarak bazı komutların yerine getirilmesi gereken birkaç sekmeli gnome terminali açmaktır. Bu komutların bazıları, önceden yapılmış bir .bashrc dosyasına bağlıdır. Ama kullanırken

gnome-terminal --tab -e "komut" --tab --tab

Komut .bashrc çalıştırılmadan önce çalıştırılır. Otomatik bir cüce terminali -e'nin elle kullanılan gibi davranmasını sağlama olasılığı var mı? ("cd / foo / bar" gibi komutlar bile gnome-terminal -e ile çalışmıyor)

Yanıtlar:


45

GNOME-terminal bash başladığında, komut yürütme söz konusu olduğunda döngü dışına çıktı: sadece girdi ve çıktıyı yönetir. Yani ~/.bashrcyüklendikten sonra bir şeyi çalıştırmak için Bash'in işbirliğine ihtiyacınız olacak .

İlk olarak, çoğu durumda, aslında komutları çalıştırmanız gerekmez ~/.bashrc. Örneğin, belirli bir dizinde bir terminal açmak basitçe ile yapılabilir cd /foo/bar && gnome-terminal. Sen benzer şekilde ortam değişkenleri ayarlayabilirsiniz: VAR=value gnome-terminal. ( ~/.bashrcOrtam değişkenlerinizi geçersiz kılarsa, yanlış yapıyorsunuz: ortam değişken tanımları aittir~/.profile )

Terminalde komutu çalıştırabilmek için ama daha önce ~/.bashrcbunu yapabilirsiniz

gnome-terminal -x sh -c 'command1; command2; exec bash'

Birden fazla sekme kullanmak istiyorsanız, -eyerine kullanmanız gerekir -x. Gnome-terminal bir boşlukta -eçalıştırmak yerine, boşluklardaki argümanlara yardımcı olmaz . Bununla birlikte, içine boşluk bırakmamaya dikkat ederseniz, bir kabuk komutu yazabilirsiniz. En azından gnome-terminal 2.26 ile, sekmeleri kullanabilirsiniz, ancak ( <TAB>değişmez bir sekme karakteri ile değiştirin ):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

Peşinde komutları çalıştırmak için gereğini yaparsanız ~/.bashrc, yapmak o komutları çalıştırın. Örneğin, sonuna aşağıdaki kodu ekleyin ~/.bashrc:

eval "$BASH_POST_RC"

Ardından bashrc'nizden sonra (gerçekten, sonunda) bir kod çalıştırmak için:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

veya (alıntı üzerinde daha az ağır)

BASH_POST_RC='command1; command2' gnome-terminal

Bu şekilde yapmayı özellikle tavsiye etmeme rağmen , komut satırına zaten girilmiş belirli bir metin ile bir uçbirime nasıl başlanır? Bölümünde belirtilen tekniklerle ilgilenebilirsiniz. .


Evet, gerçekten güzel bir numara. Bunu asla düşünmedim. Şimdi belirli bir sekme için BASH_POST_RC değişkenini farklı ayarlamanın bir yolunu bulmalıyım. Ve bu hala bir sorun gibi görünüyor. Basit bir "cüce-terminal - tab -e 'BASH_POST_RC = ls' --tab" mümkün değildir :-(
Zardoz

@ Zardoz: Aslında, gnome-terminalini sekme karakterlerini kullanarak kandırabilirsin (revize edilmiş cevabımı gör). Birden çok alıntı seviyesine dikkat edin.
Gilles 'SO- kötülük yapmayı bırak'

.. işe yarıyor :-) ... çözümünüz ve sabrınız için çok teşekkürler. Burada tam komutum (komutlarda bu boşluklarla bile çalışır: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "dışa aktarma BASH_POST_RC = \" rails server \ "; exec bash" '--tab -e' bash -c "dışa aktarma BASH_POST_RC = \" autotest \ ";" bash "'--tab
Zardoz

Sonunda çalışmasını sağladı ... Sooo'dan sonra tüm yol boyunca kotalarla yapılan birçok test. İşte benim, zsh kullanarak ve bir kerede bir sunucu ve bir konsol açma:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger 26:13

1
@ terdon Hayır, gnome-terminal -ehiç bir kabuk çağırmaz . Eğer gnome-terminal -e 'sleep 9'koşarsanız, bu komutu sleepargüman ile yürütür 9ve kabuk içermez. Eğer uygularsanız gnome-terminal -e 'sleep 9;bash', terminal hemen açılır ve kapanır, çünkü geçerli bir zaman aralığı olmadığından sleepşikayet eder 9;bash. Neler olup bittiğini gözlemleyebilirsinizstrace -f -eexecve gnome-terminal -e …
Gilles 'KÖTÜ'dür'

6

Bu -eseçeneği kullandığınızda, gnome-terminalbu komutu yeni bir kabuk başlatmadan çalıştırır (bunun gibi bir şeyi bile çalıştırabilirsiniz gnome-terminal -e gedit), bu nedenle bir komutu bashkabuk içine yeni bir terminal / sekme içine çalıştırmak istiyorsanız, bunun gibi bir şey yapmalısınız:

gnome-terminal -x bash -c "command"

Ancak "command"terminal / sekme sona erdiğinde de sona ereceğini unutmayın .


1
Sanırım demek istediğin gnome-terminal -x bash -c "command"( -etek bir argüman bekliyor). Ve commanden azından tek bir sekme başlattığınız sürece bir kabuğu çalıştırmak oldukça kolaydır - cevabımı görün .
Gilles 'SO- kötülükten vazgeçme'

gnome-terminal -x "bash" -c "command"benim için çalıştı. Not, -x arg değerinde alıntı yapar.
m3nda

Elde # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
lütfen, -xve -eoptons onaylanmadığından beri ne yaparız ???
Nyxee

~/.bashrcOP'nin istediği gibi, komutu çalıştırmadan önce bunun çalışmadığını düşünüyorum .
IgNite
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.