Làm cách nào để tạo tập lệnh mở các cửa sổ đầu cuối và thực thi các lệnh trong đó?


140

Tôi có ba tập lệnh tôi cần chạy khi khởi động máy Ubuntu, chúng bắt đầu các dịch vụ tôi sử dụng trong môi trường phát triển của mình.

Để làm điều đó, tôi tự mở ba thiết bị đầu cuối và gõ các lệnh.

Có cách nào để tạo một tập lệnh sẽ mở ba thiết bị đầu cuối và thực thi một lệnh trong mỗi lệnh này không? (Mỗi lệnh phải ở trong một cửa sổ đầu cuối riêng biệt để tôi có thể thấy đầu ra của chúng).

Câu trả lời:


138
gnome-terminal -e command

hoặc là

xterm -e command

hoặc là

konsole -e command

Khá nhiều

terminal -e command

Để làm cho thiết bị đầu cuối ở lại khi lệnh thoát:

Trong konsole có một --nocloselá cờ.

Trong xterm, có một -holdlá cờ.

Trong gnome-terminal, đi đến Chỉnh sửa -> Tùy chọn hồ sơ -> Tiêu đề . Nhấp vào tab Lệnh . Chọn Giữ thiết bị đầu cuối từ menu thả xuống có nhãn Khi lệnh thoát . Bạn nên tạo một hồ sơ mới cho điều đó và thực hiện với

gnome-terminal --window-với-profile = NAMEOFTHEPROFILE -e lệnh

1
Nếu tôi cố giữ thiết bị đầu cuối, tôi nhận được "quá trình con thoát ra bình thường với mã trạng thái 127"
Darshan Chaudhary

2
gnome-terminal không còn tùy chọn tiêu đề nữa :(
törzsmókus

1
@ törzsmókus đó là năm 2017 thực sự! Phát hành LTS có một cuộc sống hỗ trợ 5 năm. 14.04 không dừng lại cho đến tháng tư năm 2019. wiki.ubuntu.com/Releases
bhass1

1
gnome-terminal -e commandchỉ hoạt động nếu commandđược trích dẫn. Vì vậy, điều này không hoạt động: gnome-terminal -e "echo hello world; sleep 3"nhưng điều này không : gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Thở dài.
bgoodr

3
Bạn cũng có thể giữ gnome-terminal mở bằng cách thêm ; $SHELLvào cuối lệnh. Vd:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples

58

Thay vì cứng mã hóa gnome-terminal, konsole, vân vân, sử dụng hệ thống pháp thay thế. Chương trình thực thi trình giả lập thiết bị đầu cuối mặc định là:

x-terminal-emulator

Trên hệ thống của tôi, nó sẽ mở một phiên bản mới của Konsole mỗi khi tôi thực hiện lệnh này.

May mắn thay, các thiết bị đầu cuối dường như hỗ trợ -etùy chọn để thực hiện một lệnh (tôi đã xác minh nó cho konsolegnome-terminal). Các đối số sau khi lệnh được truyền cho lệnh được gọi. Bash từ chối mở trong thiết bị đầu cuối của tôi, một kịch bản bổ sung là cần thiết để có được một thiết bị đầu cuối:

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

Nếu bạn đã lưu tập lệnh trước đó /home/user/hackyvà làm cho tập lệnh thực thi, bạn sẽ chạy tập lệnh của mình với:

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

Đường dẫn đầy đủ là bắt buộc và /home/user/hackyphải được thực thi.

Nỗ lực trước đây của tôi để chạy tập lệnh trong cửa sổ terminal mới có thể được tìm thấy trong phiên bản # 2 , đó là trước khi tôi nhận ra các đối số có thể được chuyển đến x-terminal-emulator.


Trong trường hợp này, nó sẽ không giúp được nhiều vì người hỏi muốn làm điều gì đó không giống nhau cho tất cả các thiết bị đầu cuối.
nickguletskii

Nỗ lực số 3: cái này sẽ giữ cho thiết bị đầu cuối mở và chạy chương trình với các đối số tùy chọn.
Lekensteyn

1
Tôi đã sử dụng tùy chọn gnome, tuy nhiên, khi tôi chạy tập lệnh của mình, thiết bị đầu cuối chính sẽ đóng !! .. có ý kiến ​​gì không?
McLan

3
@ Suda.nese Đó là theo thiết kế, khi "thiết bị đầu cuối" hoàn thành việc thực thi tập lệnh, nó sẽ thoát vì không còn gì để làm. Bạn có thể "sửa" điều này bằng cách gọi một trình bao trong đó bạn có thể thực thi các lệnh ( bash) hoặc có một dòng như read -p "Press Return to continue".
Lekensteyn

1
Làm thế nào bạn có thể chạy nhiều hơn một lệnh trong thiết bị đầu cuối? Ví dụ cd xxx && start.sh. Người phiên dịch xem && là phần thứ hai của lệnh (hợp lý), nhưng nếu tôi trích dẫn nó, thì nó sẽ cố gắng thực thi toàn bộ như một đối số lớn
Richard

9

Rất đơn giản-

#!/bin/bash

/etc/init.d/ccpd status

Điều này là đủ cho các lệnh khác không cần hiển thị bất cứ điều gì trong thiết bị đầu cuối. Nhưng ở đây người ta phải xem trạng thái hiển thị.
Vì vậy, nó cần phải chạy trong một cửa sổ đầu cuối

#!/bin/bash

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

Các bài đăng khác dự định []là một giữ chỗ

Ở đây "NAMEOFTHEPROFILE" sẽ được thay thế bằng tên của hồ sơ "Giữ thiết bị đầu cuối khi lệnh thoát".

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1
@cipricus tôi tin rằng []chỉ là giữ chỗ
Karthik T

hiểu rồi. nhưng tôi phải làm cho thiết bị đầu cuối không đóng quá nhanh. tôi đoán đó cũng là trong câu hỏi được liên kết

@cipricus bạn đã thử hồ sơ một chưa? Chỉ cần thêm --window-with-profile=NAMEOFTHEPROFILEvào những gì tôi đã đưa ra
Karthik T

1
@cipricus Tôi sẽ phải trở về nhà để đưa ra hướng dẫn tốt hơn, nhưng ý tưởng là tạo một hồ sơ đặc biệt với bộ tùy chọn đó và sử dụng tên của hồ sơ đặc biệt ở nơi trên.
Karthik T

2
@cipricus nếu điều đó là đủ cho bạn thì cũng không sao. Hồ sơ không có gì hơn một nhóm các cài đặt. Bạn có thể thiết lập CHỈ cài đặt để sử dụng trong tập lệnh của mình và không phải sử dụng nó trong tất cả các thiết bị đầu cuối. Bạn có thể xem Chỉnh sửa -> Cấu hình để xem tất cả các cấu hình bạn có và bạn sẽ thêm một cấu hình được thiết lập như được giải thích trong bài đăng bạn đã liên kết
Karthik T

5

Được hỗ trợ bởi câu trả lời của @ nickguletskii , và nhận xét của riêng tôi dưới câu trả lời của anh ấy và được truyền cảm hứng từ nhận xét của @ Grabantot về nhận xét của tôi, đây là cách ưa thích của tôi để làm điều đó, đặc biệt là khi tôi muốn thiết bị đầu cuối mở để tôi có thể sử dụng thủ công.

Ví dụ. cách sử dụng: điều này thực sự hữu ích để thêm vào các chương trình khởi động của bạn để tập lệnh này sẽ chạy, mở một thiết bị đầu cuối, tạo và đặt tên cho một tab trong thiết bị đầu cuối và chạy một lệnh cho bạn. Hoặc, bạn chỉ có thể thêm một liên kết tượng trưng cho tập lệnh này vào máy tính để bàn của bạn. Tôi sử dụng kiểu tiếp cận này để tôi có thể nhấp đúp vào một biểu tượng trên máy tính để bàn của mình và để nó mở ra một loạt các thiết bị đầu cuối (với các tab khác nhau được đặt tên theo công việc tôi sẽ làm trong đó) và các chương trình để thiết lập môi trường lập trình của tôi, ví dụ, cho công việc hàng ngày.

Đây là một ví dụ giả định, mở ra một tab duy nhất, đặt tiêu đề là "kiểm tra", sau đó chạy lệnh đơn giản cd /etc; lsbên trong nó. Phần $SHELLcuối cùng buộc shell phải mở để sau đó bạn có thể thấy đầu ra của nó và tiếp tục sử dụng nó (Tôi đã học được điều này ở một nơi khác trên Stack Overflow):

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

Đây là một ví dụ phức tạp hơn, mở ra 3 tab riêng biệt trong cùng một thiết bị đầu cuối gnome. Đây chính xác là loại điều mà phím tắt máy tính để bàn của tôi làm để tôi có thể mở một loạt các cửa sổ lập trình cùng một lúc:

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

Đây là một sự cố của lệnh trên:

  • gnome-terminal = mở một thiết bị đầu cuối gnome
  • --tab = mở ra một tab duy nhất cho những gì tiếp theo
  • --title="tab 1" = tiêu đề tab này "tab 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= chạy bash -c 'cd /etc; ls; $SHELL'lệnh, đó là một lệnh tôi vừa tạo ra làm ví dụ; đây là những gì nó làm:
    • bash -c nói rằng đó là một bash 'c'ommand
    • cd /etc = 'c'hange' d'irectory vào đường dẫn "/ etc"
    • ls = 'Nội dung của thư mục này
    • $SHELL= tidbit mật mã này là cần thiết để giữ cho vỏ mở để bạn có thể làm việc với nó. Nếu bạn muốn shell mở, hãy chạy lệnh của bạn, sau đó đóng, chỉ cần loại bỏ phần này. Tôi, tuy nhiên, muốn tab vẫn mở để tôi có thể thực hiện phép thuật lập trình. :)
  • sau đó chúng tôi bắt đầu lại ở --tabphần để tạo tab 2, sau đó lại cho tab 3. Tùy chỉnh theo nội dung trái tim của bạn.

Ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây


1
rất vui vì tôi rất hữu ích) Tôi cũng có các kịch bản mà tôi có thể chỉ cần nhấp vào và bắt đầu làm việc với dự án. Có hai vấn đề với họ: rất nhiều cửa sổ đầu cuối (có toàn bộ màn hình riêng cho họ) và cửa sổ đóng lại sau khi máy chủ gặp sự cố. Câu trả lời đó giải quyết cả hai vấn đề của tôi với --tab + $ SHELL. Nice
lấy từ

1

bình luận cho câu trả lời của Lekensteyn. Tôi biết đây là một bài viết cũ, nhưng đối với bất kỳ ai thấy điều này hữu ích (như tôi vừa làm) Thay vì tạo một "tập lệnh hack" khác chỉ bằng cách đặt một chức năng bên trong tập lệnh mà bạn đang gọi

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

Gọi tập lệnh của bạn bằng "x-terminal-giả lập -e / path / to / script hacky_feft đối số tùy chọn ở đây"

Đừng quên đặt "$ @" vào cuối tập lệnh


-2

Sử dụng lệnh màn hình và -d tách ra từ một phiên màn hình hiện có và gắn lại ở đây - buộc một phiên màn hình mới -S tạo một phiên có tên thay vì sử dụng tên mặc định


câu trả lời này không rõ ràng chút nào, xin vui lòng quan tâm để dễ hiểu hơn
azerafati

@azerafati thực sự, màn hình không mở ra bất kỳ cửa sổ đầu cuối nào ... thậm chí không được dự định bởi gói tuyệt vời đó ...
erm3nda
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.