Как запустить KDE konsole с несколькими вкладками с различными прогами?
Я знаю, как запустить Konsole с одним исполняемым файлом, запущенным в нем, и оставить Konsole открытым после завершения программы. Я могу сделать это с помощью .desktop
file и изменить некоторые параметры в нем.
но я хотел бы сделать еще один шаг, чтобы запустить KDE konsole с несколькими открытыми вкладками, каждая из которых запускает определенную программу, и что, когда программа заканчивается, она остается открытой и дает вам подсказку.
нет man-страницы для Konsole, поэтому я даже не знаю, какие варианты он может принять. Или звонки на ди-бус? Спасибо
3 ответов
кто когда-либо видит красоту в принятом решении, надеюсь, не в разработке программного обеспечения:) это должны должен быть один лайнер или отчет об ошибке. Каждый другой общий терминал имеет эту опцию. Я провел некоторые исследования, и "почти одно линейное решение" таково:
-
создайте файл, настраивающий ваши табуляторы так и назовите его, скажем, "вкладки":
заголовок: %n;; команда: /usr/bin/htop
заголовок: %n;; команда: / usr/bin / ncmpcpp
(вот полная документация: https://docs.kde.org/stable5/en/applications/konsole/command-line-options.html Называемые исполняемые файлы-примеры. "%N " будет называть вкладку точно так же, как команда)
-
выполните его так:
konsole --tabs-from-file path_to_tabs_file / tabs
результат: новое окно konsole с 3 вкладками, запущенное определенным двоичные файлы и одно пустое приглашение. Я не мог запустить сценарий bash. Но я провел всего несколько минут тестирования.
Это решение с использованием qdbus
см. документация D-Bus.
The Konsole docs не говорит много об используемых интерфейсах, поэтому некоторые эксперименты необходимы. Я оставил комментарии в коде о том, что я пытался, но это не сработало.
это работает в 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
обновление 2016: структура qdbus снова изменилась. Вот обновление вышеуказанного скрипта (я оставил оригинал, так как в зависимости от вашей версии KDE вам может понадобиться тот или другой):
#! /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
Я еще немного покопался и нашел и еще более "субъективно" красивый ответ. Цель: запустить пустую оболочку, музыкальный плеер и сеанс экрана с irssi в 3 разных вкладках в 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" &
ключ не выполнять команду напрямую, а вызывать оболочку, которая может принимать все переданные аргументы. $SHELL имеет значение /bin / bash. Эта "проблема" описана здесь:
https://docs.kde.org/stable5/en/applications/konsole/commonissues.html
цитата: "Konsole рассматривает аргументы после опции-e как одну команду и запускает его напрямую, вместо того, чтобы анализировать и, возможно, разделять его в суб-команды для выполнения. Это отличается от суммы.
konsole -e "command1 ; command2" does not work konsole -e $SHELL -c "command1 ; command2" works