Mở một tab mới trong gnome-terminal bằng dòng lệnh [đã đóng]


122

Tôi đang sử dụng Ubuntu 9.04 x64 và khi tôi viết:

gnome-terminal --tab

Tại thiết bị đầu cuối, tôi hy vọng nó sẽ mở một tab mới trong cùng cửa sổ đầu cuối. Nhưng thay vào đó, nó sẽ mở ra một cửa sổ mới.

Tôi phát hiện ra rằng mục đích của nó là mở một tab mới trong một cửa sổ mới, tức là nếu tôi viết:

gnome-terminal --tab --tab

Nó sẽ mở ra một cửa sổ mới với hai tab.

Vì vậy, câu hỏi đặt ra là, làm cách nào để mở tab mới trong cửa sổ hiện tại bằng lệnh trong gnome-terminal?


4
nếu bạn đang viết anyway gnome-terminal, tại sao không thể bạn chỉ cần nhấn ctrl + shift + t để mở ra một tab mới;)
rasjani

13
Và tôi phải nhấn như thế nào Ctrl+Shift+Tkhi lệnh đang được chạy từ một tệp script? (Nghe nói một thứ gọi là D-Bus có thể làm được điều đó)!
Vikrant Chaudhary, 29/07/09

19
Bất cứ khi nào tôi khởi động PC, tôi cần mở một vài tab trong thiết bị đầu cuối gnome của mình. Và việc tự động hóa điều đó sẽ khiến tôi cảm thấy bản thân mình trở nên lập dị hơn một chút. (Như họ nói) Lười biếng là một đặc điểm của lập trình viên.
Vikrant Chaudhary, 29/07/09

@VikrantChaudhary threevirtues.com :-)
jpaugh 22/02/18

Stack Overflow là một trang dành cho các câu hỏi về lập trình và phát triển. Câu hỏi này có vẻ lạc đề vì nó không phải về lập trình hay phát triển. Xem những chủ đề tôi có thể hỏi tại đây trong Trung tâm trợ giúp. Có lẽ Super User hoặc Unix & Linux Stack Exchange sẽ là nơi tốt hơn để hỏi.
jww 26/09/18

Câu trả lời:


70
#!/bin/sh

WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}')
xdotool windowfocus $WID
xdotool key ctrl+shift+t
wmctrl -i -a $WID

Thao tác này sẽ tự động xác định thiết bị đầu cuối tương ứng và mở tab tương ứng.


3
Cảm ơn, hoạt động tốt. Ở dạng thích hợp -WID= xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'; xdotool windowfocus $WID; xdotool key ctrl+shift+t $WID
Vikrant Chaudhary

6
Cảm ơn vì giải pháp. Mặc dù vậy, tôi không rõ bằng cách nào tôi có thể thực hiện các lệnh khác nhau trong các tab khác nhau. Bất kể tôi thêm lệnh vào đâu, tất cả chúng đều được thực thi trong tab đầu tiên. Bạn có thể bao gồm một giải pháp cho điều này?
Calin

10
@Calin sử dụng sleep 1; xdotool type --delay 1 --clearmodifiers "your Command"; xdotool key Return;để chạy một lệnh.
dùng13107

2
Tại sao lại có WID và bit windowfocus? Cửa sổ sẽ không được lấy nét sao?
Chris Morgan,

1
Tôi đặt tập lệnh này ở đâu?
Dawoodjee

69

Bạn cũng có thể để mỗi tab chạy một lệnh đã đặt.

gnome-terminal --tab -e "tail -f somefile" --tab -e "some_other_command"

11
Tôi nhận được 'Đã xảy ra lỗi khi tạo quy trình con cho thiết bị đầu cuối này' theo phản hồi củagnome-terminal --tab -e "cd /tmp"
Hedgehog

3
@Hedgehog, tôi đã là một cách cho rằng: gnome-terminal --tab --working-directory="/home/user/X/Y/". Tôi không hiểu tại sao, nhưng "~/X/Y/"không làm việc.
glarrain

1
Tôi đang gặp sự cố với các lệnh của mình, nếu tôi chỉ sử dụng --tab thì nó hoạt động nhưng nếu tôi sử dụng --tab -e "my_bash_shorcut" thì nó không hoạt động. Bạn có biết tại sao?
Adrian Matteo

@AdrianMatteo Hơi muộn, nhưng tôi nghĩ rằng tôi đã tìm ra: nếu bạn tạo hai tệp với chữ vô nghĩa và sau đó chạy lệnh này gnome-terminal --tab -e "tail -f file_a" --tab -e "tail -f file_b", thiết bị đầu cuối gnome sẽ mở với hai tab trong đó mỗi tab sẽ có nội dung tệp tương ứng, nhưng sẽ đóng thời điểm bạn gửi ^ C. Điều này cho bạn thấy tại sao nó không hoạt động, nhưng tôi không biết làm thế nào để khắc phục điều này.
IDDQD


8

Tôi đã tìm thấy cách đơn giản nhất:

gnome-terminal --tab -e 'command 1' --tab -e 'command 2'

Tôi sử dụng tmuxthay vì sử dụng thiết bị đầu cuối trực tiếp. Vì vậy, những gì tôi muốn thực sự là một tệp lệnh / shell duy nhất và đơn giản để xây dựng sự phát triển envvới một số tmuxcửa sổ. Mã shell như sau:

#!/bin/bash
tabs="adb ana repo"
gen_params() {

    local params=""
    for tab in ${tabs}
    do  
        params="${params} --tab -e 'tmux -u attach-session -t ${tab}'"
    done
    echo "${params}"
}
cmd="gnome-terminal $(gen_params)"
eval $cmd

Những dấu ngoặc kép 'command 1'làm việc tốt hơn so với dấu ngoặc kép mà chỉ hoạt động đối với tôi khi tôi cũng chỉ định--working-directory="/some/path/"
Barry Staes

4

Phiên bản phức tạp hơn một chút (để sử dụng từ cửa sổ khác):

#!/bin/bash

DELAY=3

TERM_PID=$(echo `ps -C gnome-terminal -o pid= | head -1`) # get first gnome-terminal's PID
WID=$(wmctrl -lp | awk -v pid=$TERM_PID '$3==pid{print $1;exit;}') # get window id

xdotool windowfocus $WID
xdotool key alt+t # my key map
xdotool sleep $DELAY # it may take a while to start new shell :(
xdotool type --delay 1 --clearmodifiers "$@"
xdotool key Return

wmctrl -i -a $WID # go to that window (WID is numeric)

# vim:ai
# EOF #

2

Chỉ trong trường hợp, bạn muốn mở

  • một cửa sổ mới
  • với hai tab
  • và thực hiện lệnh trong đó
  • và để chúng luôn mở ...

của bạn đây:

gnome-terminal --geometry=73x16+0+0 --window \
  --working-directory=/depot --title='A' --command="bash -c ls;bash" \
  --tab --working-directory=/depot/kn --title='B' --command="bash -c ls;bash"

(tương tự cho mate-terminalbtw.)


Hoạt động tương tự cho xfce4-terminalbtw. Lệnh nào trong số các lệnh này thực sự chịu trách nhiệm về điểm and having them stay open...? Tôi đang hỏi vì điều này không được đề cập trong trang chủ ít nhất choxfce4-terminal
Jankapunkt

1

Để kết hợp một số điểm khác nhau ở trên, đây là một tập lệnh sẽ chạy bất kỳ đối số nào được chuyển đến tập lệnh vim new_tab.sh:

#!/bin/bash
#
# Dependencies:
#   sudo apt install xdotool

WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}')
xdotool windowfocus $WID
xdotool key ctrl+shift+t
wmctrl -i -a $WID
sleep 1; xdotool type --delay 1 --clearmodifiers "$@"; xdotool key Return;

Tiếp theo làm cho nó có thể thực thi: chmod +x new_tab.sh

Bây giờ bạn có thể sử dụng nó để chạy bất cứ thứ gì bạn muốn trong tab mới: ./new_tab.sh "watch ls -l"


0

Tôi chưa cài đặt gnome-terminal nhưng bạn có thể thực hiện việc này bằng cách sử dụng lệnh gọi DBUS trên dòng lệnh sử dụng dbus-send .


0

Thay vào đó, hãy cân nhắc sử dụng Roxterm.

roxterm --tab

mở một tab trong cửa sổ hiện tại.


0

Đối với bất kỳ ai đang tìm kiếm giải pháp không sử dụng dòng lệnh: ctrl + shift + t


10
Họ đang yêu cầu dòng lệnh., Để tự động hóa mọi thứ. Những phím tắt này hiếm khi hữu ích.
Muthu Ganapathy Nathan

đó chính xác là những gì tôi đang tìm kiếm. Câu hỏi trong tiêu đề không giới hạn ở 'giải pháp tự động' @EAGER_STUDENT và thành thật mà nói, tôi thấy rất khó để đưa ra trường hợp sử dụng mà tôi cần GUI tự động. Điều đó giống như thực hiện một cuộc phẫu thuật tim mở qua cột sống.
Steffen Winkler

6
@SteffenWinkler Tôi rất vui vì giải pháp đã giúp bạn. Nhưng vì câu hỏi cho biết 'sử dụng dòng lệnh', tôi đã giả sử sử dụng một số lệnh tự động, một cái gì đó như câu trả lời được bình chọn cao ... Dù sao câu trả lời tự nó làm rõ 'Đối với bất kỳ ai tìm kiếm giải pháp không sử dụng dòng lệnh' .... Kudos cho câu trả lời .... Hơn nữa, 'Tôi cảm thấy khó đưa ra một trường hợp sử dụng mà tôi cần GUI tự động. Có lẽ tôi luôn cần 5 tab để mở khi khởi động. Trong trường hợp đó, nó sẽ hữu ích. Nhưng trong trường hợp đó chúng ta cũng có thể sử dụng phím tắt để tự động nào;)
Muthu Ganapathy Nathan

2
Ví dụ nơi tôi cần mở tab tự động; Tôi đang tự động hóa các tập lệnh khởi động trên rô bốt và tôi muốn mở các tab để chạy các lệnh để khi các quy trình gặp sự cố (như cuối cùng tất cả đều xảy ra), tôi có thể truy cập từ máy tính xách tay của mình và xem đầu ra nhật ký trên bảng điều khiển mà không cần đào qua các thư mục tệp nhật ký.
WillC

-2

Để mở nhiều tab trong cùng một cửa sổ đầu cuối, bạn có thể sử dụng giải pháp sau.

Tập lệnh mẫu:

pwd='/Users/pallavi/Documents/containers/platform241/etisalatwallet/api-server-tomcat-7/bin'
pwdlog='/Users/pallavi/Documents/containers/platform241/etisalatwallet/api-server-tomcat-7/logs'
pwd1='/Users/pallavi/Documents/containers/platform241/etisalatwallet/core-server-jboss-7.2/bin'
logpwd1='/Users/pallavi/Documents/containers/platform241/etisalatwallet/core-server-jboss-7.2/standalone/log'

osascript -e "tell application \"Terminal\"" \

-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $pwd\" in front window" \
-e "do script \"./startup.sh\" in front window" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $pwdlog\" in front window" \
-e "do script \"tail -f catalina.out \" in front window" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $pwd1\" in front window" \
-e "do script \"./standalone.sh\" in front window" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $logpwd1\" in front window" \
-e "do script \"tail -f core.log \" in front window" \
-e "end tell"
> /dev/null 

1
Nghe có vẻ như đây là câu trả lời rất trọng tâm của OSX khi câu hỏi rõ ràng là về thiết bị đầu cuối (gnome) trong linux. osascriptlà OSX (Apple)
nhập vào

@nhed: Cảm ơn — câu trả lời của tôi là cái quái gì vậy ?? phản hồi cho câu trả lời này. Pallavi: Ngay cả khi câu hỏi là về Mac, việc mã hóa cứng đường dẫn về nhà của riêng bạn không giúp câu trả lời của bạn hữu ích lắm. Tôi khuyên bạn nên sử dụng $HOMEbiến môi trường hoặc OSX tương đương nếu nó khác.
Michael Scheper
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.