Bagaimana menjalankan xfce-terminal dengan perintah berbeda per tab dan tetap menggunakan tab setelah perintah kembali?


20

Untuk menjaga ikhtisar saya suka menempatkan beberapa perintah selalu dalam urutan yang sama dan mulai secara bersamaan (gradle, git, database, scala-REPL, jboss ...)

-H (tahan) tampaknya berarti bahwa terminal tidak ditutup setelah penghentian, tetapi bagaimana cara saya mengakhiri proses seperti itu dengan sengaja? Tidak semuanya? Sedemikian rupa sehingga saya bisa terus menggunakan terminal.

Saya menggunakan xubuntu dengan dengan xfce4-terminal dan bash. Apakah ada solusi GUI yang lebih baik untuk memulai banyak perintah, dengan kemampuan untuk terus bekerja di jendela / tab itu?

Pembaruan: Jika Anda tidak tahu perintah-perintah ini: Jboss dan gradle terus-menerus menghasilkan output, yang Anda tidak ingin dicampur dalam terminal yang sama. Dan kadang-kadang mereka perlu diinterupsi dengan ^ C, dan restart. Saya tidak suka membuka kembali istilah xfce4 dan menavigasi ke direktori yang harus saya ikuti.

Database dan scala-REPL bersifat interaktif sehingga tidak ada gunanya memulai di latar belakang.

Skrip startup saya saat ini hanya menavigasi ke direktori yang diinginkan, dan membuka semua tab dalam urutan yang tepat untuk menemukannya selalu di posisi yang sama, menamai setiap tab untuk tujuannya:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
    --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
    --tab -T bash       --working-directory=/home/stefan/oximity \
    --tab -T gradle     --working-directory=/home/stefan/oximity/med \
    --tab -T git        --working-directory=/home/stefan/oximity/med \
    --tab -T mysql      --working-directory=/opt/mini/mysql \
    --tab -T jboss      --working-directory=/opt/mini/jboss \
    --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
    --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

Eclipse dan arandr terlepas dari shell dan dijalankan di jendela mereka sendiri, sehingga param -e (eksekusi) berfungsi. Saya pikir untuk scala-REPL berfungsi karena ini adalah perintah terakhir dalam daftar.


Pertanyaan Anda masih belum jelas bagi saya. Anda ingin terminal untuk kembali ke shell setelah perintah itu dimulai dengan berakhir? Sesuatu seperti xterm -e 'stuff;bash'?
frostschutz

1
Pertanyaan ini masih perlu diperbaiki! Saya menemukan utas ini, saya pikir inilah yang dicari OP: Bagaimana agar terminal xfce4 tetap terbuka? . Dia ingin tahu cara mengakses tab di mana saklar "-H" telah digunakan dan terus menggunakannya sebagai jendela terminal normal. OP, dapatkah Anda mengkonfirmasi jika saya benar?
slm

@slm: Ya, saya ingin terminal tetap terbuka untuk memproses perintah lebih lanjut - Saya hanya ingin memulai yang pertama dari perintah saya secara otomatis dan memiliki banyak, bernama tab.
pengguna tidak dikenal

Jawaban:


21

The -H/-holdpilihan adalah untuk menjaga terminal emulator Jendela terbuka sekali aplikasi mulai di dalamnya (shell atau lainnya) telah keluar. Dalam keadaan itu, tidak ada lagi yang bisa terjadi.

Jika Anda ingin memulai perintah sebagai pekerjaan dari shell interaktif dalam emulator terminal xfce4-terminal dan tetap menjalankan shell dan menggunakannya secara interaktif setelah aplikasi keluar, dengan bash, Anda dapat menggunakan $PROMPT_COMMANDvariabel lingkungan, untuk xfce-terminalmemulai shell interaktif yang memulai perintah yang diberikan tepat sebelum prompt pertama.

xfce4-terminal \
  -T eclipse \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
  \
  --tab -T arandr \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
  \
  --tab -T bash \
  --working-directory=/home/stefan/oximity \
  ...

Dengan begitu, perintahnya adalah pekerjaan shell itu yang berarti Anda dapat menangguhkannya dengan Ctrl-Zdan melanjutkannya nanti fg/bgseolah-olah Anda telah memasukkannya di prompt shell interaktif itu.

Itu mengasumsikan bahwa Anda tidak mengatur $PROMPT_COMMANDdi Anda ~/.bashrc. Perhatikan juga bahwa status keluar dari perintah tidak akan tersedia di $?.

Untuk membuatnya lebih seperti perintah yang dimasukkan pada prompt shell, Anda bahkan dapat menambahkannya ke daftar riwayat. Seperti:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
  unset PROMPT_COMMAND
  history -s vi\ /etc/motd
  vi /etc/motd" bash'

Dengan begitu, begitu Anda keluar vi, Anda dapat menekan Uptombol untuk memanggil kembali viperintah yang sama .

Cara yang lebih mudah untuk menulisnya:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
  xfce4-terminal --disable-server \
          -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
    --tab -T       top -e 'env CMD=top bash'

Itu:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

solusi seperti yang diberikan dalam jawaban lain berfungsi tetapi memiliki beberapa kelemahan:

  1. Jika Anda menekan Ctrl-Csaat cmdsedang berjalan, itu akan membunuh bagian luar shkarena hanya ada satu grup proses untuk keduanya shdan cmd.
  2. Anda tidak dapat menggunakan Ctrl-Zuntuk menangguhkancmd
  3. Seperti dalam $PROMPT_COMMANDpendekatan, status keluar dari perintah tidak akan tersedia di $?.

Anda dapat mengatasi 1 di atas dengan melakukan:

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

Atau:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

Dengan yang terakhir, Anda juga dapat menangguhkan proses dengan Ctrl-Z, tetapi Anda tidak akan dapat menggunakannya fg/bg. Anda akan dapat melanjutkannya di latar belakang dengan melakukan kill -s CONTpada pid dari cmd.


Wow. Itu cukup rumit, tetapi tampaknya berhasil. :) Saya tidak tahu mengapa imbalannya hilang. Sayangnya saya tidak punya waktu sebelumnya untuk menguji petunjuk.
pengguna tidak diketahui

Saya tidak benar-benar mengerti semua aturan sistem karunia. Karena saya pikir Anda layak mendapatkan hadiah, saya memulai kembali hadiah baru.
pengguna tidak diketahui

Ya hadiahnya berakhir setelah 7 hari, dan Anda memiliki 24 jam setelahnya untuk menghadiahkannya. Jika Anda tidak menyadarinya, mereka akan ditugaskan ke pengguna mana pun yang memiliki rep tertinggi (2 atau lebih tinggi). Berikut ini lebih dari yang ingin Anda ketahui tentang hadiah 8-): meta.stackexchange.com/questions/16065/…
slm

1
@AdrianLopez, dalam bashskrip, tidak ada riwayat sama sekali karena tidak ada pengeditan baris atau interaksi pengguna kecuali Anda gunakan read -edalam skrip Anda (dan Anda akan melihat bahwa history -s textberfungsi di sana untuk mengungguli riwayat yang dilihat oleh itu read -e). Di sini, kami tidak menjalankan history -sdari skrip, tetapi dari $PROMPT_COMMANDkait shell interaktif.
Stéphane Chazelas

1
@ StéphaneChazelas Luar Biasa. Mengikuti jawaban Anda yang berharga lainnya di sini , saya harus menambahkan bahwa xfce4-terminalkarena setidaknya versi 0.6.3 sekarang menginginkan parameter tambahan - --disable-server- untuk melewati lingkungan. Ref: lists.debian.org/debian-user/2017/10/msg00045.html .
ジ ョ ー ジ

5

Sejauh yang saya mengerti pertanyaan Anda, Anda ingin menjalankan beberapa proses di terminal, dapat Ctrl+ + Cdan, setelah itu, biarkan jendela tetap terbuka, dengan shell.

Jika saya benar, ini bisa dilakukan dengan perintah seperti ini:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"

Apakah itu berfungsi dengan banyak tab?
pengguna tidak diketahui

@ penggunaunknown Tentu. Cukup tambahkan --tab sebelum perintah lainnya. Misalnya, jika Anda ingin menjalankan "ls / etc" dan "ls / dev", Anda akan mengeluarkan: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Jika Anda menggunakan Terminal Gnome, Anda harus menulis --tab juga sebelum perintah pertama.
Rafael Cavalcanti

Ini sedikit membantu, sementara tidak sejauh yang saya harapkan. Ketika saya mulai gradle dengan `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle meledakWar explodedWarSync; bash' "` sebuah tab dibuka, dinamai tetapi menunjukkan "gradle: perintah tidak ditemukan "saat memasukkan perintah di sana berfungsi dengan baik. Git, mysql dan scala bekerja dengan baik seperti itu, tetapi untuk jboss, Ctrl-C mengakhiri seluruh jboss-tab. Saya hanya bisa menyiapkan shell mulai dari sana - mungkin menggemakan perintah untuk memasukkan. Saya tidak begitu mengerti apa yang membuat perbedaan di sini.
pengguna tidak diketahui

1

banyak aplikasi di xfce4-terminaltab

Menambahkan shell interaktif ke setiap tab xfce

Anda dapat menggunakan retasan ini untuk menambahkan shell jika / ketika Anda Ctrl+Ctab:

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

Ini akan memberi Anda yang berikut:

   ss dari xfce dg tab

   ss dari xfce dengan Ctrl + C


0

Ketika keluar dari shell tanpa -Hterminal akan ditutup juga. Dengan flag ini terminal akan tetap berjalan, tetapi proses shell ditutup dan tidak dapat dihidupkan kembali.

Saya pikir Anda mencoba mengarsipkan bahwa Anda baru saja memulai terminal Anda dan lingkungan pengembangan Anda mulai?

Anda dapat membuat skrip shell dan memasukkan semua perintah Anda di dalamnya. Di akhir skrip, Anda baru memulai shell Anda:

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

Kemudian panggil skrip ini melalui xfce4-terminal -e /the/script. Ketika berhenti dari $SHELLproses induk (skrip Anda) selesai dan tugas-tugas latar belakang akan menerima sinyal keluar dan berhenti juga.

Jika Anda ingin membuatnya tetap hidup, gunakan misalnya nohup jboss &dalam skrip Anda


Itu tidak berhasil karena gradle dan JBoss secara permanen menghasilkan output. Anda tidak ingin mereka mencampuradukkan hasil mereka. Database- dan scala-terminal bersifat interaktif. Tidak ada gunanya menempatkan mereka di latar belakang. Gagasan untuk membuka perintah lain di tab yang berbeda adalah, bahwa riwayat hanya diisi dengan beberapa perintah berbeda untuk satu topik dan karenanya dapat dijelajahi dengan cepat.
pengguna tidak diketahui
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.