Buka terminal gnome secara terprogram dan jalankan perintah setelah bashrc dieksekusi

35

Untuk memulai lingkungan dev saya, saya menulis naskah kecil. Salah satu bagiannya adalah membuka terminal gnome dengan beberapa tab di mana secara otomatis beberapa perintah harus dijalankan. Beberapa perintah itu bergantung pada .bashrc yang sudah dijalankan. Tetapi saat menggunakan

gnome-terminal --tab -e "command" --tab --tab

perintah dieksekusi sebelum .bashrc dieksekusi. Apakah ada kemungkinan untuk membuat terminal gnome -e otomatis berperilaku seperti yang digunakan secara manual? (bahkan perintah seperti "cd / foo / bar" tidak berfungsi dengan gnome-terminal -e)

Zardoz
sumber

Jawaban:

45

Begitu gnome-terminal sudah mulai bash, itu keluar dari loop sejauh menyangkut eksekusi perintah: itu hanya mengelola input dan output. Jadi, Anda perlu kerja sama bash untuk menjalankan sesuatu setelah ~/.bashrcdimuat.

Pertama, dalam banyak kasus, Anda sebenarnya tidak perlu menjalankan perintah setelah itu ~/.bashrc. Misalnya, membuka terminal di direktori tertentu dapat dilakukan dengan mudah cd /foo/bar && gnome-terminal. Anda dapat mengatur variabel lingkungan dengan cara yang sama: VAR=value gnome-terminal. (Jika Anda ~/.bashrcmenimpa variabel lingkungan, Anda salah melakukannya: definisi variabel lingkungan termasuk di~/.profile dalamnya )

Untuk menjalankan perintah di terminal, tetapi sebelumnya ~/.bashrc, Anda bisa melakukannya

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

Jika Anda ingin menggunakan banyak tab, Anda harus menggunakan -ealih-alih -x. Gnome-terminal secara tidak membantu memecah argumen -epada spasi alih-alih mengeksekusi melalui shell. Meskipun demikian, Anda dapat menulis perintah shell jika Anda memastikan untuk tidak memasukkan spasi di dalamnya. Setidaknya dengan gnome-terminal 2.26, Anda dapat menggunakan tab, (ganti <TAB>dengan karakter tab literal):

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'

Jika Anda perlu menjalankan perintah setelah ~/.bashrc, membuat ia menjalankan perintah. Misalnya, sertakan kode berikut di akhir ~/.bashrc:

eval "$BASH_POST_RC"

Kemudian untuk menjalankan beberapa kode setelah (sungguh, di akhir) bashrc Anda:

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

atau (kurang berat pada kutipan)

BASH_POST_RC='command1; command2' gnome-terminal

Meskipun saya khususnya tidak merekomendasikan melakukannya dengan cara ini, Anda mungkin tertarik pada teknik yang disebutkan dalam Cara memulai terminal dengan teks tertentu yang sudah dimasukkan pada baris perintah? .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ya, memang trik yang bagus. Tidak pernah memikirkan itu. Sekarang saya harus menemukan cara untuk mengatur variabel BASH_POST_RC berbeda untuk tab tertentu. Dan itu tampaknya masih menjadi masalah. "Gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" yang sederhana tidak mungkin :-(
Zardoz
@Zardoz: Sebenarnya, Anda bisa menipu gnome-terminal menggunakan karakter tab (lihat jawaban saya yang sudah direvisi). Pikirkan beberapa tingkat kutipan.
Gilles 'SO- stop being evil'
.. berfungsi :-) ... terima kasih banyak atas solusi dan kesabaran Anda. Di sini, perintah lengkap saya (bekerja bahkan dengan spasi-spasi di dalam perintah: gnome-terminal --working-directory = "/ home / zardoz / proyek / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rails server \ "; exec bash"' --tab -e 'pesta -c "ekspor BASH_POST_RC = \" autotest \ "; exec bash"' --tab
Zardoz
Akhirnya berhasil ... Setelah begitu banyak tes dengan tanda kutip sepanjang jalan. Ini milik saya, menggunakan zsh dan membuka server dan konsol sekaligus: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
1
@terdon Tidak, gnome-terminal -etidak meminta shell sama sekali. Jika Anda menjalankan gnome-terminal -e 'sleep 9', itu mengeksekusi perintah sleepdengan argumen 9, dan tidak ada shell yang terlibat. Jika Anda mengeksekusi gnome-terminal -e 'sleep 9;bash'maka terminal membuka dan menutup segera, karena sleepmengeluh bahwa 9;bashitu bukan interval waktu yang valid. Anda dapat mengamati apa yang terjadi denganstrace -f -eexecve gnome-terminal -e …
Gilles 'SO- stop being evil'
6

Ketika Anda menggunakan -eopsi, gnome-terminalperintah run akan dijalankan tanpa memulai shell baru (Anda bahkan dapat menjalankan sesuatu seperti gnome-terminal -e gedit:), jadi jika Anda ingin menjalankan perintah ke bashshell ke terminal / tab baru Anda harus melakukan sesuatu seperti ini:

gnome-terminal -x bash -c "command"

Tetapi perhatikan bahwa ketika "command"berakhir terminal / tab akan berakhir juga.

cYrus
sumber
1
Saya pikir maksud Anda gnome-terminal -x bash -c "command"( -emengharapkan satu argumen). Dan itu cukup sederhana untuk mengeksekusi shell setelah command, setidaknya selama Anda memulai satu tab - lihat jawaban saya .
Gilles 'SO- stop being evil'
gnome-terminal -x "bash" -c "command"bekerja untukku. Perhatikan kutipan pada nilai -x arg.
m3nda
Saya mendapatkan # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo
1
tolong, apa yang kita lakukan sejak -xdan -eopsi-opsi yang ditinggalkan ???
nyxee
Saya percaya bahwa ini tidak berjalan ~/.bashrcsebelum menjalankan perintah, seperti yang awalnya ditanyakan oleh OP.
IgNite