Làm cách nào để chạy xfce-terminal với các lệnh khác nhau trên mỗi tab và tiếp tục sử dụng các tab sau khi các lệnh đã trở lại?


20

Để giữ cho tổng quan, tôi muốn đặt nhiều lệnh luôn theo cùng một thứ tự và tự động bắt đầu chúng cùng nhau (gradle, git, cơ sở dữ liệu, scala-REPL, jboss ...)

-H (giữ) dường như có nghĩa là thiết bị đầu cuối không bị đóng sau khi chấm dứt, nhưng làm thế nào để tôi chấm dứt quá trình như vậy một cách có chủ ý? Không có gì? Theo cách mà tôi có thể tiếp tục sử dụng thiết bị đầu cuối.

Tôi đang sử dụng xubfox với xfce4-terminal và bash. Có giải pháp GUI nào tốt hơn để khởi động nhiều lệnh, với khả năng tiếp tục hoạt động trong cửa sổ / tab đó không?

Cập nhật: Nếu bạn không biết các lệnh này: Jboss và gradle liên tục tạo đầu ra, mà bạn không muốn được trộn lẫn trong cùng một thiết bị đầu cuối. Và đôi khi chúng cần được ngắt với ^ C và khởi động lại. Tôi không muốn mở lại một thuật ngữ xfce4 và điều hướng đến thư mục tôi cần hành động.

Cơ sở dữ liệu và scala-REPL là tương tác nên không có ý nghĩa trong việc bắt đầu chúng trong nền.

Tập lệnh khởi động hiện tại của tôi chỉ điều hướng đến các thư mục mong muốn và mở tất cả các tab theo đúng thứ tự để tìm thấy chúng luôn ở cùng một vị trí, đặt tên cho mỗi tab theo mục đích của nó:

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 và arandr được tách ra khỏi shell và chạy trong cửa sổ riêng của chúng, do đó, param -e (thực thi) hoạt động. Tôi nghĩ đối với scala-REPL nó hoạt động vì nó là lệnh cuối cùng trong danh sách.


Câu hỏi của bạn vẫn chưa rõ ràng với tôi. Bạn muốn một thiết bị đầu cuối trở lại vỏ sau khi lệnh được bắt đầu bằng chấm dứt? Một cái gì đó như thế xterm -e 'stuff;bash'nào?
frostschutz

1
Câu hỏi này vẫn cần làm việc! Tôi tìm thấy chủ đề này, tôi nghĩ đây là những gì OP đang tìm kiếm: Làm thế nào để giữ xfce4-terminal mở? . Anh ta muốn biết làm thế nào để truy cập vào một tab nơi công tắc "-H" đã được sử dụng và tiếp tục sử dụng nó như một cửa sổ đầu cuối bình thường. OP, bạn có thể vui lòng xác nhận nếu tôi đúng?
slm

@slm: Có, tôi muốn giữ thiết bị đầu cuối mở để xử lý các lệnh tiếp theo - Tôi chỉ muốn tự động bắt đầu các lệnh đầu tiên của mình và có nhiều tab được đặt tên.
người dùng không xác định

Câu trả lời:


21

Các -H/-holdlựa chọn là để giữ cho các thiết bị đầu cuối giả lập Window mở một khi ứng dụng bắt đầu vào nó (vỏ hoặc khác) đã kết thúc. Trong trạng thái đó, không có gì có thể xảy ra nữa.

Nếu bạn muốn bắt đầu một lệnh như một công việc của trình bao tương tác trong trình giả lập thiết bị đầu cuối xfce4-terminal và giữ cho trình vỏ hoạt động và sử dụng nó một cách tương tác sau khi ứng dụng đã thoát, với bash, bạn có thể sử dụng $PROMPT_COMMANDbiến môi trường, để xfce-terminalbắt đầu một shell tương tác bắt đầu lệnh đã cho ngay trước dấu nhắc đầu tiên.

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 \
  ...

Theo cách đó, các lệnh là các công việc của shell đó, điều đó có nghĩa là bạn có thể tạm dừng chúng Ctrl-Zvà tiếp tục chúng sau này fg/bgnhư thể bạn đã nhập chúng vào dấu nhắc của shell tương tác đó.

Điều đó giả định rằng mặc dù bạn không đặt $PROMPT_COMMANDtrong ~/.bashrc. Cũng lưu ý rằng trạng thái thoát của lệnh sẽ không có sẵn trong $?.

Để làm cho nó thậm chí giống như lệnh đã được nhập tại dấu nhắc shell, bạn thậm chí có thể thêm nó vào danh sách lịch sử. Như:

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

Bằng cách đó, một khi bạn thoát vi, bạn có thể nhấn Upphím để gọi lại vilệnh đó.

Một cách dễ dàng hơn để viết nó:

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'

Các:

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

giải pháp như được đưa ra trong các câu trả lời khác hoạt động nhưng có một số nhược điểm:

  1. Nếu bạn nhấn Ctrl-Ctrong khi cmdđang chạy, nó sẽ giết chết bên ngoài shvì chỉ có một nhóm quy trình cho cả hai shcmd.
  2. Bạn không thể sử dụng Ctrl-Zđể đình chỉcmd
  3. Giống như trong $PROMPT_COMMANDcách tiếp cận, trạng thái thoát lệnh sẽ không khả dụng $?.

Bạn có thể làm việc khoảng 1 ở trên bằng cách thực hiện:

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

Hoặc là:

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

Với cái sau, bạn cũng sẽ có thể tạm dừng quá trình Ctrl-Z, nhưng bạn sẽ không thể sử dụng fg/bgnó. Bạn sẽ có thể tiếp tục nó trong nền mặc dù bằng cách thực hiện kill -s CONTtrên pid của cmd.


Ồ Điều đó khá phức tạp, nhưng nó có vẻ hiệu quả. :) Tôi không biết tại sao phần thưởng biến mất. Không may tôi đã không có thời gian trước để kiểm tra các gợi ý.
người dùng không xác định

Tôi không thực sự hiểu tất cả các quy tắc của hệ thống tiền thưởng. Vì tôi nghĩ rằng bạn xứng đáng với tiền thưởng, tôi khởi động lại một tiền thưởng mới.
người dùng không xác định

Vâng, tiền thưởng hết hạn sau 7 ngày và bạn có 24 giờ sau đó để trao thưởng cho họ. Nếu bạn không biết họ, họ sẽ được chỉ định cho bất kỳ người dùng nào có đại diện cao nhất (2 hoặc cao hơn). Đây là nhiều hơn bạn từng muốn biết về tiền thưởng 8-): meta.stackexchange.com/questions/16065/ợi
slm

1
@AdrianLopez, trong bashcác tập lệnh, hoàn toàn không có lịch sử vì không có chỉnh sửa dòng hoặc tương tác người dùng trừ khi bạn sử dụng read -etập lệnh của mình (và bạn sẽ thấy điều đó history -s texthoạt động ở đó để đánh dấu lịch sử mà điều đó nhìn thấy read -e). Ở đây, chúng tôi không chạy history -stừ một tập lệnh, mà là từ một $PROMPT_COMMANDcái vỏ tương tác.
Stéphane Chazelas

1
@ StéphaneChazelas Tuyệt vời. Theo câu trả lời có giá trị khác của bạn ở đây , tôi phải thêm rằng xfce4-terminalít nhất là phiên bản 0.6.3 bây giờ muốn có thêm một tham số - --disable-server- để vượt qua môi trường. Tham chiếu: list.debian.org/debian-user/2017/10/msg00045.html .
ジ ョ ー

5

Theo như tôi hiểu câu hỏi của bạn, bạn muốn chạy một số quy trình trong một thiết bị đầu cuối, có thể Ctrl+ Cchúng và sau đó, giữ cho cửa sổ mở, với vỏ.

Nếu tôi đúng, điều này có thể được thực hiện bằng một lệnh như thế này:

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

Nó có hoạt động với nhiều tab không?
người dùng không xác định

@userunknown Chắc chắn rồi. Chỉ cần thêm --tab trước các lệnh khác. Ví dụ: nếu bạn muốn chạy "ls / etc" và "ls / dev", bạn sẽ phát hành: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Nếu bạn sử dụng Gnome Terminal, bạn cũng phải viết --tab trước lệnh đầu tiên.
Rafael Cavalcanti

Điều này là một chút hữu ích, trong khi không xa như tôi hy vọng. Khi tôi bắt đầu gradle với `xfce4-terminal - Work-library = / home / stefan / oximity / med -e" bash -c 'gradle explodingWar explodingWarSync; bash' "` một tab được mở, được đặt tên nhưng nó hiển thị "gradle: lệnh không tìm thấy "trong khi nhập lệnh ở đó hoạt động tốt. Git, mysql và scala hoạt động tốt theo cách đó, nhưng đối với jboss, Ctrl-C chấm dứt toàn bộ tab jboss. Tôi chỉ có thể chuẩn bị vỏ bắt đầu từ đó - có thể lặp lại lệnh để nhập. Tôi không thực sự hiểu những gì làm nên sự khác biệt ở đây.
người dùng không xác định

1

nhiều ứng dụng trong xfce4-terminaltab

Thêm một vỏ tương tác vào mỗi tab xfce

Bạn có thể sử dụng bản hack này để thêm shell nếu / khi bạn Ctrl+Cmột tab:

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

Điều này sẽ cung cấp cho bạn như sau:

   ss của xfce w / tab

   ss của xfce w / đầu Ctrl + C


0

Khi thoát khỏi vỏ mà không có -Hthiết bị đầu cuối cũng sẽ bị đóng. Với cờ này, thiết bị đầu cuối sẽ tiếp tục chạy, nhưng quá trình shell bị đóng và không thể phục hồi.

Tôi nghĩ rằng bạn đang cố gắng lưu trữ rằng bạn chỉ cần bắt đầu thiết bị đầu cuối của bạn và môi trường phát triển của bạn bắt đầu?

Bạn có thể tạo một tập lệnh shell và đặt tất cả các lệnh của bạn bên trong nó. Khi kết thúc tập lệnh, bạn chỉ cần bắt đầu trình bao của mình:

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

Sau đó gọi kịch bản này qua xfce4-terminal -e /the/script. Khi thoát khỏi $SHELLtiến trình cha mẹ (tập lệnh của bạn) đã hoàn thành và các tác vụ nền cũng sẽ nhận được tín hiệu thoát và thoát.

Nếu bạn muốn giữ cho chúng sống, hãy sử dụng ví dụ nohup jboss &trong tập lệnh của bạn


Điều đó không hiệu quả vì gradle và jboss đang tạo ra sản lượng vĩnh viễn. Bạn không muốn có chúng trộn lẫn đầu ra của chúng. Cơ sở dữ liệu và thiết bị đầu cuối scala là tương tác. Không có ý nghĩa trong việc đưa chúng vào nền. Ý tưởng để mở các lệnh khác trong các tab khác nhau là, lịch sử chỉ được lấp đầy với một vài lệnh khác nhau cho một chủ đề và do đó có thể duyệt nhanh.
người dùng không xác định
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.