Как запустить KDE konsole с несколькими вкладками с различными прогами?

Я знаю, как запустить Konsole с одним исполняемым файлом, запущенным в нем, и оставить Konsole открытым после завершения программы. Я могу сделать это с помощью .desktop file и изменить некоторые параметры в нем.

но я хотел бы сделать еще один шаг, чтобы запустить KDE konsole с несколькими открытыми вкладками, каждая из которых запускает определенную программу, и что, когда программа заканчивается, она остается открытой и дает вам подсказку.

нет man-страницы для Konsole, поэтому я даже не знаю, какие варианты он может принять. Или звонки на ди-бус? Спасибо

3 ответов


кто когда-либо видит красоту в принятом решении, надеюсь, не в разработке программного обеспечения:) это должны должен быть один лайнер или отчет об ошибке. Каждый другой общий терминал имеет эту опцию. Я провел некоторые исследования, и "почти одно линейное решение" таково:

  1. создайте файл, настраивающий ваши табуляторы так и назовите его, скажем, "вкладки":

    заголовок: %n;; команда: /usr/bin/htop

    заголовок: %n;; команда: / usr/bin / ncmpcpp

(вот полная документация: https://docs.kde.org/stable5/en/applications/konsole/command-line-options.html Называемые исполняемые файлы-примеры. "%N " будет называть вкладку точно так же, как команда)

  1. выполните его так:

    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:

  1. создайте простой исполняемый файл скрипта с помощью:

#!/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