9

this may be a bit obscure but I'm trying to do something a bit tricky :

I'm writing a script that opens up a new tab with commands, I'd like to switch back to first tab after the user has input to the secondary tab (the fact that this tab focuses is intended behavior and the most important) :

echo "new tab is about to open..."
gnome-terminal --tab --active --title="install dependencies..." -- bash -c 'echo "hello";
#other commands;
read user_input;
#now I want to switch back to first tab while this tab works in the backgroud;
command;
command;
command;
command;
command;
command;
command;'

echo "hello welcome back to the correct tab, we have been waiting for you! :)"
read new_user_input;

is such a thing possible?

I had this idea because clearly the --active argument calls something that brings the new tab into focus (and even works if the tab calling this is not active). so something of the nature must be possible.

5

Manual Method

As per this Q&A: Is there a hotkey to switch between tabs in the default terminal app?

After opening the new tab you can return to the previous tab with Ctrl + pg up

Automated Method within script

In order to send the signal to Bash Shell (gnome-terminal) use xdotool:

sudo apt install xdotool

In your script issue this command:

xdotool key Control+Page_Up

I've just finished installing and testing on Ubuntu 16.04 LTS and it works perfectly. It should work on all X11 desktops.


More conventional method

OP desires Wayland support and more importantly a POSIX method that works with many *NIX distributions.

From this Q&A:

... comes this command:

gnome-terminal -e 'bash -c "sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade; exec bash"'

We will modify the example command to look like this:

gnome-terminal -e 'bash -c "second-script.sh; exec bash"'

This is what second-script.sh looks like:

#!/bin/bash

# AU question: https://askubuntu.com/questions/1134625/shell-script-focus-already-open-terminal-tab-from-second-terminal-tab/1135206#1135209

echo "Welcome to the second script."
echo " Run command 1."
sleep 1
echo " Run command 2."
sleep 1
read -n 1 -s -r -p "Press any key to continue"

touch /tmp/second-script-user-ack # signal parent to continue commands there
echo " Run command 3."
sleep 5
echo " Run command 4."
sleep 5

# Now terminates.
exit 0

Always remember to marks scripts executable using:

chmod a+x second-script.sh

Note: This opens a second terminal window that stays open until user closes it. This can be changed to auto-close.

Our first (Parent) script will look like this:

#!/bin/bash

# AU question: https://askubuntu.com/questions/1134625/shell-script-focus-already-open-terminal-tab-from-second-terminal-tab/1135206#1135209

file=/tmp/second-script-user-ack
if [ -f $file ] ; then
    rm $file
fi

window=$(xdotool getactivewindow)
# Launch second script running in background, don't wait
gnome-terminal -e 'bash -c "second-script.sh; exec bash"' &&

while true ; do
    if [ -f $file ] ; then
        break
    fi
done

xdotool windowactivate $window

echo "Child still running. Ready to run extra Parent Commands"
read -n 1 -s -r -p "Press any key to continue"
echo
echo " Parent Command 1."
sleep 5
echo " Parent Command 2."
sleep 5

echo "Parent program completed"
read -n 1 -s -r -p "Press any key to continue"

exit 0

Advantages of current approach:

  • You can see both windows running at same time. With second tab you can't see both scripts output.
  • After child process (second-script.sh) completes output is still visible until window is closed.

Wayland tools

There aren't many Wayland tools to control active windows.

I did find this: ydotool but you'll need to compile it by hand. There is no Debian/Ubuntu installation package. There is an Arch Linux installation package which some of your users can use.

| improve this answer | |
  • I'm more interested in wayland desktops. (it does work on wayland) – tatsu Apr 19 '19 at 12:20
  • what about a POSIX-compliant solution. if possible this should work on all dirtributions. this is for a shell script. this keybinding is not necessarily set this way. – tatsu Apr 19 '19 at 12:26
  • Some xdotool functions still work under wayland: askubuntu.com/questions/956640/…. There is a project to create wodotool a Wayland equivalent to xdotool: github.com/whot/woodotool – WinEunuuchs2Unix Apr 19 '19 at 12:28
  • why not something more robust? what if the user clicks the tab himself as is currently required of him? then the previous tab becomes the "install dependencies" tab and it goes back to that. the user will be understandably confused and take a while to realize he did indeed manage to switch tabs but the script switched him back. also this keybinding is probably not functional on most other distributions. – tatsu Apr 19 '19 at 12:31
  • 1
    @tatsu I've designed a more conventional method and revised answer. – WinEunuuchs2Unix Apr 19 '19 at 13:45
3
+200

Well, it consumes more time then I expected. Finally, I manage to get what you want. Try this script in this I get the window name with the use of 'xdotool' and switch to the active window using 'wmctrl'.

#!/bin/bash

echo "new tab is about to open..."

winname=`xdotool getactivewindow getwindowname;`

gnome-terminal --tab --active --name="install dependencies..." -- bash -c 'echo "hello";
read new_user_input;
#other commands;
echo "winname = "$1;
wmctrl -a $1;
sleep 5;
' bash "$winname"

echo "hello welcome back to the correct tab, we have been waiting for you! :)"

read new_user_input;
| improve this answer | |
  • if, after running the script you open a new tab, then switch back to "install dependencies.." and type something in you end up on the third tab (the one I opened manually) and are not greeted with "hello welcome back to the correct..." unless you manually switch back to the first tab. I also tried with extra quotes arround the winname variable, like this : wmctrl -a '$winname'; this did not help. – tatsu Apr 21 '19 at 0:03
  • Yes, it's because the $winname is not passed in the new terminal. I edit the script please try the new one. – Mohit Malviya Apr 22 '19 at 6:22
  • winname = wmctrl: option requires an argument -- 'a' also does not switch back – tatsu Apr 22 '19 at 10:09
  • the option requires an argument error is came because we do not pass the value of winname in the new terminal. – Mohit Malviya Apr 22 '19 at 10:11
  • so how do we fix that? – tatsu Apr 22 '19 at 12:30
2

You can try simulating keystrokes to change to your other tab:

You can use xdotool to simulate any keystroke combination. To change tab in gnome-terminal use Ctrl + Page_Up (go one tab back). So xdotool key --clearmodifiers Ctrl+Page_Up will change to your old tab.

To make sure that the focus of this keystroke is the terminal I used wmctrl which can be used like this: wmctrl -a "install dependencies".

So a command to switch back to your previous tab would be:

wmctrl -a "install dependencies" && xdotool key --clearmodifiers Ctrl+Page_Up

You can install those tools using sudo apt-get install wmctrl xdotool

| improve this answer | |
  • the "install dependencies" tab is the one that's supposed to have the call to bring back to the tab that opened it. I imagine in your above post wmctrl -a "install dependencies" && xdotool key --clearmodifiers Ctrl+Page_Up was not meant to be part of the "install dependencies" tab? – tatsu Apr 19 '19 at 12:36
  • Yes, but the problem of xdotool is that it sends global keystrokes. So whatever program is the focus of the user at the moment will get the keystrokes. So to make sure that the terminal gets those, first put focus on the terminal. And because the terminal's name is "install dependencies", this will be seen in wmctrl -l. (in case you have multiple terminals open). The user might be doing something else at the moment... – icezyclon Apr 19 '19 at 12:39
  • hmm weird it does switch back either way. the issue I have is that it suffers both from going to the tab to the left, which in my test case with 3 tabs where i ran my script from the second, brought my script back to the third. also if I click another tab while it's waiting to execute the switch command, it chooses the wrong tab as well. here's a test you can try gnome-terminal --tab --active --title="install dependencies" -- bash -c 'echo "hello"; sleep 2;wmctrl -a "install dependencies" && xdotool key --clearmodifiers Ctrl+Page_Up; sleep 100' – tatsu Apr 19 '19 at 12:42
  • 1
    I have never used this feature, but it could be possible to focus terminals by their PID? I would have to take a closer look at that...You can use ` echo $$ ` to get the PID of current shell. Then use wmctrl -p to change to pid. – icezyclon Apr 19 '19 at 12:50
  • 1
    Yea, you can't change the title in gnome-terminal (only in tab)... I'm out of ideas, sorry. – icezyclon Apr 19 '19 at 13:11
1

Setting the title of terminal windows is removed from gnome-terminal. So I tried this on the rox terminal. You need to install this two software:-

apt install roxterm
apt install wmctrl

I can manage to get what you want. Try this script for testing.

#!/bin/bash


roxterm --title="First Tab is this" -- bash -c `

echo "new tab is about to open..."

roxterm --title="Second Tab is This" -- bash -c 'echo "hello";' &
wmctrl -a "First Tab is this";

`&
| improve this answer | |
  • sorry the script installing a new terminal breaks scope of my script. users want to be able to run my script with their own terminal, as is understandable. – tatsu Apr 19 '19 at 13:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.