Mở nhiều tab thiết bị đầu cuối và lệnh chạy


9

Tôi cần mở nhiều tab thiết bị đầu cuối, đặt tiêu đề cho chúng, đi đến một thư mục và làm cho mỗi tab chạy một lệnh.

Tôi chưa quen với Linux và shell script, sau khi tìm kiếm trực tuyến và kiểm tra một số giải pháp, tôi đã tạo tập lệnh này ( EDITED dựa trên các câu trả lời bên dưới):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Nó mở các tab, đặt tên cho chúng, nhưng không thực hiện được các lệnh tạo ra lỗi này:

Đã xảy ra lỗi khi tạo quy trình con cho thiết bị đầu cuối này

Một thiếu sót khác là nếu tôi tạm dừng lệnh đang chạy thì nó sẽ đóng tab mà tôi không muốn. Tôi cần có khả năng dừng lệnh và chạy lại nó trong cùng một tab.

Điều gì là sai với kịch bản? Có cách nào khác đơn giản hơn để làm điều đó?

Lưu ý: Nếu tôi loại bỏ phần (-e "\" bash -c $ {cmds [i]}; bash \ "") khỏi lệnh, nó sẽ mở các tab trong thư mục đã cho và đặt tên cho chúng, không có lỗi.

-Chỉnh sửa-1:

Sau khi áp dụng câu trả lời @Tuknutx bên dưới và chỉnh sửa tập lệnh, lỗi không xuất hiện nữa, nhưng nó cho tôi bash: rails c: command not foundrails stạo một ứng dụng rails mới thay vì khởi động máy chủ rails, tôi đang sử dụng .rmvrc để chọn một gemet khi thư mục này được truy cập .


Nếu bạn muốn thực hiện kịch bản chạy của bạn khi khởi động ubuntu của bạn: - bạn có thể chạy bạn kịch bản như một dịch vụ mới nổi ( help.ubuntu.com/community/UbuntuBootupHowto ) hoặc: sử dụng "ứng dụng khởi động" trong môi trường máy tính để bàn của bạn
Aboelnour

nếu tôi viết cmds[1]="'ping 192.168.9.9'"nó sẽ cho tôi cùng một lỗi nhưng tôi đã giải quyết nó bằng cách xóa dấu ngoặc đơn. Vì vậy, nếu tôi viết cmds[1]="ping 192.168.9.9"Nó hoạt động.
cúc

@Brary nhưng tôi không hiểu tại sao nó lại mở ba tab - một mặc định và hai tab khác được đặt trong tập lệnh. Bởi vì chúng tôi xác định tab=" --tab-with-profile=Default"??
cúc

Câu trả lời:


3

Tôi khuyên bạn nên sử dụng tmuxvới tmuxinator, nó sẽ thực hiện công việc cho bạn và bạn cũng có thể dựa vào terminatorbố cục!

Để terminatorkiểm tra bố cục, câu trả lời của mhnagaoka tại đây cũng hỏi:

  1. Sau khi thiết lập bố cục của bạn, nhấp chuột phải vào bất kỳ nền thiết bị đầu cuối nào và chọn Tùy chọn → tab Bố cục và nhấp vào nút Thêm .

  2. Đặt tên cho nó và nhấn Đóng .

  3. Điều này sẽ tạo ra các ~/.config/terminator/configtập tin được đề cập .

  4. Bây giờ bạn có thể bắt đầu terminator bằng cách sử dụng bố cục đã lưu bằng cách sử dụng: terminator -l yourLayout(thay thế yourLayout bằng bất cứ thứ gì bạn chọn ở bước 2).

  5. (tùy chọn) Chỉnh sửa ~/.config/terminator/configtệp sao cho đúng [layouts]và lồng bên dưới tệp [[yourLayout]], đổi tên yourLayout thành mặc định và xóa / đổi tên bố cục mặc định trước đó . Bây giờ, khi Terminator bắt đầu mà không có bất kỳ tham số nào, nó sẽ tải [[default]]bố cục tùy chỉnh của bạn !


2

Để tóm tắt một vài câu trả lời khác và nhận xét của họ, đây là những gì tôi đã kết thúc với:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Lưu ý rằng tôi đã lấy đi tab 'chính', cấu hình và tiêu đề (có vẻ không được dùng nữa gnome-terminal).


Đầu ra của $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.`Sử dụng từ - - Để kết thúc các tùy chọn và đặt dòng lệnh để thực thi sau nó. . that's an output but the comands get executed. When i use $ tab - `lệnh không được thực thi và các lệnh đầu cuối:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee

1

Thử cái này:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

nếu không thì toàn bộ biểu thức sau -e sẽ được hiểu là lệnh.

Để bao gồm các bí danh từ .bashrc sử dụng -icthay vìc


Lỗi không xuất hiện nữa, cảm ơn. Nhưng nó mang lại cho tôi bash: rails c: command not foundvà 'rails s' tạo ra một ứng dụng rails mới thay vì khởi động máy chủ rails. Điều này thay đổi phạm vi câu hỏi, tôi sẽ chỉnh sửa nó với sửa đổi ur cho kịch bản
Brary

Nó có hoạt động không nếu bạn thử rails ctrên một thiết bị đầu cuối mà không có gì khác? Có lẽ nó nên rails -c?
TuKsn

Đã thử mà không làm việc. Tôi thậm chí đã thử rvm list gemsetsvà nó nói No command 'rvm' found.. chạy cùng một lệnh rvm list gemsetstrong tab đầu tiên mở mà không chạy lệnh và nó đã hoạt động! nó có chạy lệnh trước khi môi trường tải và tệp .rvmrc được tải không?
Brary

1

Đối số bạn đưa ra tùy chọn -e "bash -c command; bash"bao gồm các trích dẫn. Nó diễn giải toàn bộ chuỗi đó là tên của một lệnh! Hãy thử điều này thay thế : -e "bash -c 'command ; bash'". Bằng cách này, những gì được chạy trên cửa sổ đầu cuối của bạn là command, và sau đó chạy, bạn được cung cấp một vỏ con gái, mà tôi giả sử là những gì bạn muốn. Ngẫu nhiên, bạn cũng có thể nói 'command & bash'; Điều này sẽ chạy lệnh trên nền và cung cấp cho bạn vỏ con gái ngay lập tức.


Tôi đã thay đổi điều này options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )thành options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )và nó cũng gây ra lỗi tương tự .. tôi đang làm đúng không?
Brary

Không hoàn toàn chính xác: xóa \ "trước bash đầu tiên và \" sau 'sau bash thứ hai.
Silvio Levy

Cảm ơn, tôi đã chỉnh sửa câu hỏi và thay đổi phạm vi của nó để bao gồm đường ray và rvm.
Brary
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.