I know how to start a Konsole with one executable running in it, and leave the Konsole open after the program ends. I can do this using a .desktop
file and change s
I did some more digging and found and even more "subjectively" beautiful answer. Goal: start empty shell, music player and screen session running irssi in 3 different tabs in konsole:
#!/bin/bash
konsole --hold --new-tab &
konsole --hold --new-tab -e $SHELL -c "/usr/bin/screen -DRS irssi-in-screen irssi" &
konsole --hold --new-tab -e $SHELL -c "/usr/bin/ncmpcpp" &
The clue is not to execute the the command directly but to call a shell, that can take in all arguments passed. $SHELL is set to /bin/bash. This "issue" is documented here:
https://docs.kde.org/stable5/en/applications/konsole/commonissues.html
Quote: " Konsole treats arguments after the -e option as one command and runs it directly, instead of parsing it and possibly dividing it into sub-commands for execution. This is different from xterm.
konsole -e "command1 ; command2" does not work konsole -e $SHELL -c "command1 ; command2" works
Who ever sees beauty in the accepted solution is hopefully not in software development : ) This must be a one liner or a bug report must be submitted. Every other common terminal has this option. I did some research and the "almost one liner solution" is this:
Create a file configuring your tabulators like so and name it let's say "tabs":
title: %n;; command: /usr/bin/htop
title: %n;; command: /usr/bin/ncmpcpp
(Here's the full documentation: https://docs.kde.org/stable5/en/applications/konsole/command-line-options.html The called command binaries are examples. The "%n" will name the tab exactly like the command)
Execute it like so:
konsole --tabs-from-file path_to_tabs_file/tabs
Result: A new konsole window with 3 tabs, running defined binaries and one empty prompt. I couldn't get a bash script to run. But I did just a few minutes of testing.
This is a solution using qdbus
, see D-Bus documentation.
The Konsole docs doesn't say much about the interfaces used, so some experimenting is necessary. I've left comments in the code about the things I attempted but that didn't work.
This works in KDE 5.
#! /bin/bash
# Multi command start in various konsole tabs
# List of commands to run, with parameters, in quotes, space-separated; do not use quotes inside (see bash arrays)
COMMANDS=("/my/prog1 param" "/my/prog2 param2" "/my/prog3 param1 param2 param3")
# KDS=$KONSOLE_DBUS_SERVICE # This is a ref to current Konsole and only works in Konsole
# KDS=$(org.kde.konsole) # This is found in some examples but is incomplete
qdbus >/tmp/q0 # Get the current list of konsoles
/usr/bin/konsole # Launch a new konsole
# PID=$! # And get its PID - But for some reason this is off by a few
sleep 1
qdbus >/tmp/q1 # Get the new list of konsoles
# KDS=org.kde.konsole-$PID
# KDS=org.kde.konsole # Sometimes
KDS=$(diff /tmp/q{0,1} | grep konsole) # Let's hope there's only one
#echo $KDS
KDS=${KDS:3}
echo $KDS
echo $KDS >/tmp/KDS
echo >>/tmp/KDS
qdbus $KDS >>/tmp/KDS || exit
echo >>/tmp/KDS
# See note https://docs.kde.org/trunk5/en/applications/konsole/scripting.html about using /Konsole
qdbus $KDS /Konsole >>/tmp/KDS
echo >>/tmp/KDS
FirstTime=1
for i in "${COMMANDS[@]}"
do
echo "Starting: $i"
echo >>/tmp/KDS
if [ $FirstTime -eq 1 ]
then
session=$(qdbus $KDS /Konsole currentSession)
FirstTime=0
else
session=$(qdbus $KDS /Konsole newSession)
fi
echo $session >>/tmp/KDS
# Test: Display possible actions
qdbus $KDS /Sessions/${session} >>/tmp/KDS
# Doesn't work well, maybe use setTabTitleFormat 0/1 instead
# Title "0" appears to be the initial title, title "1" is the title used after commands are executed.
#qdbus $KDS /Sessions/${session} setTitle 0 $i
#qdbus $KDS /Sessions/${session} setTitle 1 $i
# The line break is necessary to commit the command. \n doesn't work
qdbus $KDS /Sessions/${session} sendText "${i}
"
# Optional: will ping when there's no more output in the window
qdbus $KDS /Sessions/${session} setMonitorSilence true
done
Update 2016: the structure of qdbus has changed again. Here's an update of the above script (I left out the original since depending on your KDE version you may need one or the other):
#! /bin/bash
# Multi command start in various konsole tabs
# List of commands to run, with parameters, in quotes, space-separated; do not use quotes inside (see bash arrays)
COMMANDS=("echo 1" "echo 2" "echo 3")
# KDS=$KONSOLE_DBUS_SERVICE # This is the ref of the current konsole and only works in a konsole
# KDS=$(org.kde.konsole) # This is found in some examples but is incomplete
qdbus >/tmp/q0 # Get the current list of konsoles
/usr/bin/konsole # Launch a new konsole
sleep 1
qdbus >/tmp/q1 # Get the new list of konsoles
KDS=$(diff /tmp/q{0,1} | grep konsole) # Let's hope there's only one
KDS=${KDS:3}
echo $KDS
echo $KDS >/tmp/KDS
echo >>/tmp/KDS
qdbus $KDS >>/tmp/KDS || exit
echo >>/tmp/KDS
# See note https://docs.kde.org/trunk5/en/applications/konsole/scripting.html about using /Konsole
qdbus $KDS /konsole >>/tmp/KDS
echo >>/tmp/KDS
FirstTime=1
for i in "${COMMANDS[@]}"
do
echo "Starting: $i"
echo >>/tmp/KDS
if [ $FirstTime -eq 1 ]
then
session=$(qdbus $KDS /Windows/1 currentSession)
FirstTime=0
else
session=$(qdbus $KDS /Windows/1 newSession)
fi
echo $session >>/tmp/KDS
# Test: Display possible actions
qdbus $KDS /Sessions/${session} >>/tmp/KDS
# The line break is necessary to commit the command. \n doesn't work
qdbus $KDS /Sessions/${session} sendText "${i}
"
# Optional: will ping when there's no more output in the window
qdbus $KDS /Sessions/${session} setMonitorSilence true
done
qdbus solution above didn't work for me because blockable call /usr/bin/konsole, so I upgrade it a little. I'm using ZSH so change shebang on yours.
#! /bin/zsh
# Multi command start in various konsole tabs
# List of commands to run, with parameters, in quotes, space-separated; do not use quotes inside (see bash arrays)
COMMANDS=("vi" "nano")
# Geting length of the COMMANDS array
len_arr=${#COMMANDS[@]}
# Simple /usr/bin/konsole block this script, no work for me. So use qdbus to run konsole
qdbus org.kde.klauncher5 /KLauncher exec_blind "/usr/bin/konsole" "/home/$USER"
# Wait until konsole was run up completely. 1s for me
sleep 1s
# get the last added konsole and save it in $KDS variable
qdbus | grep konsole | tail -1 | { read KDS }
# loop the array with commands .
for (( i=1; i<=$len_arr; i++ ))
do
if [ $i -gt 1 ]
then
# for all commands beside first getting the number of the new konsole tab
session=$(qdbus $KDS /Windows/1 newSession)
else
# get the number of the current console tab
session=$(qdbus $KDS /Windows/1 currentSession)
fi
# run current command in tab
qdbus $KDS /Sessions/${session} runCommand "${COMMANDS[$i]}"
# Silence if you need. I'm not using it.
# Optional: will ping when there's no more output in the window
# qdbus $KDS /Sessions/${session} setMonitorSilence true
done