Mở terminal gnome theo chương trình và thực thi các lệnh sau khi bashrc được thực thi


35

Để bắt đầu môi trường dev của tôi, tôi đã viết một kịch bản nhỏ. Một phần là để mở một thiết bị đầu cuối gnome với một số tab trong đó tự động thực hiện một số lệnh. Một số lệnh đó phụ thuộc vào .bashrc đã được thực thi. Nhưng khi sử dụng

gnome-terminal --tab -e "lệnh" --tab --tab

lệnh được thực thi trước khi .bashrc được thực thi. Có khả năng làm cho một gnome-terminal -e tự động hoạt động như một cái được sử dụng thủ công không? (ngay cả các lệnh như "cd / foo / bar" không hoạt động với gnome-terminal -e)

Câu trả lời:


45

Khi gnome-terminal đã bắt đầu bash, nó sẽ thoát khỏi vòng lặp khi có liên quan đến việc thực thi lệnh: nó chỉ quản lý đầu vào và đầu ra. Vì vậy, bạn sẽ cần sự hợp tác của bash để chạy một cái gì đó sau khi ~/.bashrcđã được tải.

Đầu tiên, trong nhiều trường hợp, bạn thực sự không cần phải thực thi các lệnh sau ~/.bashrc. Ví dụ, mở một thiết bị đầu cuối trong một thư mục cụ thể có thể được thực hiện đơn giản với cd /foo/bar && gnome-terminal. Bạn có thể đặt các biến môi trường theo cách tương tự : VAR=value gnome-terminal. (Nếu bạn ~/.bashrcghi đè các biến môi trường, bạn đang làm sai: định nghĩa biến môi trường thuộc về~/.profile )

Để thực thi các lệnh trong terminal, nhưng trước đó ~/.bashrc, bạn có thể làm

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

Nếu bạn muốn sử dụng nhiều tab, bạn phải sử dụng -ethay vì -x. Gnome-terminal vô tình phân tách đối số -etại các khoảng trắng thay vì thực thi nó thông qua shell. Tuy nhiên, bạn có thể viết lệnh shell nếu bạn đảm bảo không bao gồm khoảng trắng trong đó. Ít nhất là với gnome-terminal 2.26, bạn có thể sử dụng các tab, mặc dù (thay thế <TAB>bằng một ký tự tab theo nghĩa đen):

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'

Nếu bạn cần chạy các lệnh sau ~/.bashrc, hãy làm cho chạy các lệnh. Ví dụ: bao gồm đoạn mã sau ở cuối ~/.bashrc:

eval "$BASH_POST_RC"

Sau đó, để chạy một số mã sau (thực sự, vào cuối) bashrc của bạn:

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

hoặc (ít nặng về trích dẫn)

BASH_POST_RC='command1; command2' gnome-terminal

Mặc dù tôi không đặc biệt khuyên bạn nên làm theo cách này, bạn có thể quan tâm đến các kỹ thuật được đề cập trong Cách khởi động thiết bị đầu cuối với văn bản nhất định đã được nhập trên dòng lệnh? .


Vâng, thực sự là một mẹo hay. Không bao giờ nghĩ về điều đó. Bây giờ tôi phải tìm cách đặt biến BASH_POST_RC khác nhau cho tab cụ thể. Và đó dường như vẫn là một vấn đề. Không thể sử dụng "gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" đơn giản :-(
Zardoz

@Zardoz: Trên thực tế, bạn có thể lừa gnome-terminal bằng cách sử dụng các ký tự tab (xem câu trả lời sửa đổi của tôi). Tâm trí nhiều cấp độ trích dẫn.
Gilles 'SO- ngừng trở nên xấu xa

.. nó hoạt động :-) ... cảm ơn rất nhiều vì giải pháp và sự kiên nhẫn của bạn. Ở đây, lệnh hoàn chỉnh của tôi (hoạt động ngay cả với các khoảng trắng trong các lệnh: gnome-terminal - Work-library = "/ home / zardoz / dự án / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rails server \ "; exec bash" '--tab -e' bash -c "export BASH_POST_RC = \" autotest \ "; exec bash" '--tab
Zardoz

Cuối cùng đã làm cho nó hoạt động ... Sau khi rất nhiều bài kiểm tra với dấu ngoặc kép. Đây là của tôi, sử dụng zsh và mở máy chủ và bảng điều khiển cùng một lúc: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 Không, gnome-terminal -ekhông gọi một cái vỏ nào cả. Nếu bạn chạy gnome-terminal -e 'sleep 9', lệnh đó sẽ thực thi lệnh sleepvới đối số 9và không có shell nào được tham gia. Nếu bạn thực thi gnome-terminal -e 'sleep 9;bash'thì thiết bị đầu cuối sẽ mở và đóng ngay lập tức, vì sleepphàn nàn rằng đó 9;bashkhông phải là khoảng thời gian hợp lệ. Bạn có thể quan sát những gì đang xảy ra vớistrace -f -eexecve gnome-terminal -e …
Gilles 'SO- ngừng trở nên xấu xa'

6

Khi bạn sử dụng -etùy chọn, gnome-terminalnó sẽ chạy lệnh đó mà không cần khởi động shell mới (thậm chí bạn có thể chạy một cái gì đó như gnome-terminal -e gedit:), vì vậy nếu bạn muốn chạy một lệnh vào bashshell vào một terminal / tab mới, bạn phải làm một cái gì đó như thế này:

gnome-terminal -x bash -c "command"

Nhưng lưu ý rằng khi "command"kết thúc terminal / tab cũng sẽ kết thúc.


1
Tôi nghĩ bạn có nghĩa là gnome-terminal -x bash -c "command"( -emong đợi một đối số duy nhất). Và nó khá đơn giản để thực hiện một shell sau đó command, ít nhất là miễn là bạn đang bắt đầu một tab duy nhất - xem câu trả lời của tôi .
Gilles 'SO- ngừng trở nên xấu xa

gnome-terminal -x "bash" -c "command"đã làm cho tôi. Lưu ý trích dẫn về giá trị -x arg.
m3nda 29/07/2015

Tôi nhận được # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
xin vui lòng, chúng ta làm gì kể từ khi -x-eoptons đang bị phản đối ???
nyxee

Tôi tin rằng điều này không chạy ~/.bashrctrước khi thực hiện lệnh, như yêu cầu ban đầu của OP.
IgNite
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.