moin.

ich richte momentan kitty ein. ein problem kann ich nicht lösen.
in der bashrc habe ich fastfetch als startoption.
wenn ich jetzt in kitty ein neues window öffne ist in jedem window fastfetch. ich möchte das nur im ersten.
wie kann ich das konfigurieren?

danke

Alles was in der .bashrc steht, wird immer ausgeführt. Du kannst das Ganze in einen Wrapper packen, der testet, ob bereits mindestens zwei kitty-Prozesse laufen (also das gerade geöffnete Fenster, und ein eventuell bereits schon geöffnetes), das "kostet" natürlich bei jedem Start der Bash ein bisschen was, ist aber absolut vernachlässigbar.

[ "$(ps -e | grep -c '[k]ittie')" -lt 2 ] && fastfetch

Ungetestet, aber sollte klappen.

ok, danke schonmal für die hilfe.
prinzipiell verstehe ich die vorgehensweise, allerdings sind meine "programmierkünste" äußerst beschränkt. das letzte mal ein taschenrechner in C , batch in dos und html vor 23 jahren. lol
ich habe jetzt den parameter in der .bashrc so verändert:

vorher

fastfetch --load-config examples/7.jsonc --logo /usr/share/fastfetch/presets/examples/fflogo.txt

in

[ "$(ps -e | grep -c '[k]ittie')" -lt 2 ] && fastfetch --load-config examples/7.jsonc --logo /usr/share/fastfetch/presets/examples/fflogo.txt

da ändert sich aber nichts. fastfetch erscheint trotzdem in jedem fenster.
wo liegt mein fehler?

  • Dirk hat auf diesen Beitrag geantwortet.

    Ich würde als Alternative folgendes vorschlagen:
    RUN_ONCE="/tmp/$UID_run_once
    if [ ! -f ${RUN_ONCE} ]; then
    touch ${RUN_ONCE}
    fastfetch --load-config examples/7.jsonc --logo /usr/share/fastfetch/presets/examples/fflogo.txt
    fi
    unset RUN_ONCE

    • Bearbeitet

    TC Ich will nicht ausschließen, das ich Mist gebaut habe 🙂 Habe mein System gerade nicht im Zugriff und machs gerade aus dem Kopf, aber gib mal ps -e | grep '[k]ittie' ein (also ohne -c), wenn du nur ein Fenster auf hast, solltest du eine Zeile als Ergebnis bekommen. Hab ich ...

    Edit: Ich hab jetzt mal nach der Manpage geguckt. Es müsste grep -ce sein, damit er die eckigen Klammern richtig interpretiert ✨

    [ "$(ps -e | grep -ce '[k]ittie')" -lt 2 ] && fastfetch --load-config examples/7.jsonc --logo /usr/share/fastfetch/presets/examples/fflogo.txt
    • -c für count, damit grep statt der gefundenen Zeilen die Anzahl der Zeilen ausgibt
    • -e für expression damit grep den Suchbegriff als regulären Ausdruck interpretiert

    Ohne -e sollte genau so klappen, dann aber statt [k]ittie nach kittie suchen (und statt -lt 2 dann -lt 3). Das ist eigentlich nur ein Trick, damit grep sich nicht selbst findet - und ich bin mir nicht mal mehr sicher, ob das überhaupt noch nötig ist.

    • Martin-MS hat auf diesen Beitrag geantwortet.

      @Dirk
      Wäre "pgrep -c" nicht besser geeignet als die Kombination von "ps" und "grep"?

      leider zeigt das alles keinen erfolg. mein weg ging anfangs über die kitty.conf
      mit dem shortcut
      map ctrl+enter launch clear

      aber das hat des neue fenster direkt geschlossen

      Dirk Ohne -e sollte genau so klappen, dann aber statt [k]ittie nach kittie suchen (

      Warum wird nach kittie gesucht, und nicht nach dem Namen des Prozesses kitty?
      kittie wird als Ergebnis von grep stets 0 liefern, damit ist die Bedingung -lt 2 immer WAHR und fastfetch wird unabhängig von der Anzahl tatsächlich gestarteter kitty-Prozesse immer ausgeführt.

      @TC: Versuche mal folgendes:
      if [ $(pgrep -c "kitty") -lt 2 ] ; then fastfetch ; fi

        • Bearbeitet

        Martin-MS Warum wird nach kittie gesucht, und nicht nach dem Namen des Prozesses kitty?
        kittie wird als Ergebnis von grep stets 0 liefern, damit ist die Bedingung -lt 2 immer WAHR und fastfetch wird unabhängig von der Anzahl tatsächlich gestarteter kitty-Prozesse immer ausgeführt.

        hab ich getestet, kein erfolg.

        das muss doch einfacher zu lösen sein.
        laut der kitty website kann ich in der config ein neues fenster mit multiplen aufgaben starten. dort ist das beispiel:

        map f1 launch sh -c "ls && exec zsh"

        leider funktionier das überhaupt nicht. das fenster wird sofort geschlossen, warum auch immer.mit oder ohne anführungszeichen

        nehme ich den auzuführenden befehl weg und starte

        map f1 launch sh

        kommt leeres fenster mit der anzeige

        sh-5.2$

        direkt vor meinem curser der normal nutzbar ist.
        also fast am ziel 🙂

          • Bearbeitet

          Martin-MS Warum wird nach kittie gesucht, und nicht nach dem Namen des Prozesses kitty?

          LOL, ja 😃 Du hast natürlich recht. Der zu zählende Prozess muss natürlich richtig benannt werden.

          TC nehme ich den auzuführenden befehl weg und starte

          map f1 launch sh

          kommt leeres fenster mit der anzeige

          sh-5.2$

          Wenn du eine völlig andere Shell startest, bekommst du natürlich auch ein völlig anderes Ergebnis ... Mach mal was Martin-MS geschrieben hat, also mit dem richtigen Namen. (Ich wusste doch, das was falsch war bei mir!)

          So, Doppelpost um die Notification zu triggern 🙂 @TC

          Bin jetzt zuhause, und habs mit einem simplen echo ja getestet, allerdings in der zsh und mit alacritty. Meine initiale Idee funktioniert wie erwartet. Auch die angepasste Variante mit pgrep von @Martin-MS funktioniert ohne Probleme, wobei ich diese syntax hier irgendwie lieber mag:

          [ "$(pgrep -c 'alacritty')" -lt 2 ] && echo ja

          Das gibt beim ersten geöffneten alacritty-Fenster „ja“ aus, und bei jedem weiteren geöffneten Fenster nicht. Statt alacritty einfach kitty (und nicht kittie 😃) einsetzen, und statt echo ja eben das, was du da gern ausführen möchtest.

          Noch einfacher wird es nicht gehen.

          • TC hat auf diesen Beitrag geantwortet.
          • tuxnix gefällt das.
            • Bearbeitet

            Ich kenne kitty nicht und hab jetzt auch nicht ganz nachvervolgt was du exakt bewirken willst.

            Ich nutze sway und in der config Datei habe ich Zeilen wie diese stehen:
            bindsym $mod+e exec 'swaymsg "workspace e̲ditor" && if [ $(pgrep -cx kate) -lt 1 ]; then $(kate) & fi'

            Das bewirkt folgendes:
            Die Tastenkombination mod+e wechelt zum Fester editor und falls kate noch nicht läuft wird es gestartet und falls es schön läuft dann eben nicht noch ein zweites mal.

            • Bearbeitet

            Dirk Bin jetzt zuhause, und habs mit einem simplen echo ja getestet, allerdings in der zsh und mit alacritty. Meine initiale Idee funktioniert wie erwartet. Auch die angepasste Variante mit pgrep von @Martin-MS funktioniert ohne Probleme, wobei ich diese syntax hier irgendwie lieber mag:

            [ "$(pgrep -c 'alacritty')" -lt 2 ] && echo ja

            Das gibt beim ersten geöffneten alacritty-Fenster „ja“ aus, und bei jedem weiteren geöffneten Fenster nicht. Statt alacritty einfach kitty (und nicht kittie 😃) einsetzen, und statt echo ja eben das, was du da gern ausführen möchtest.

            Noch einfacher wird es nicht gehen.

            ok. ich werde da iwo einen fehler aufgrund mangelnder kompetenz haben. aber ich gebe nicht auf! ich lern das schon noch...
            ich poste mal den kompletten inhalt meiner .bahrc

            #
            # ~/.bashrc
            #
            
            # If not running interactively, don't do anything
            [[ $- != *i* ]] && return
            
            alias ls='ls --color=auto'
            alias grep='grep --color=auto'
            PS1='[\u@\h \W]\$ '
            
            [ "$(pgrep -c 'kitty')" -lt 2 ] && fastfetch --load-config examples/7.jsonc --logo /usr/share/fastfetch/presets/examples/fflogo.txt
            
            
            powerline-daemon -q
            POWERLINE_BASH_CONTINUATION=1
            POWERLINE_BASH_SELECT=1
            . /usr/share/powerline/bindings/bash/powerline.sh

            in der kitty.conf habe ich auch keinen shortcut der dazwischen gretscht. neues fenster wird standartmäßig über modifierkey+enter geöffnet.

            leider ist fastfetch wieder in jedem fenster

            TC map f1 launch sh -c "ls && exec zsh"

            leider funktionier das überhaupt nicht. das fenster wird sofort geschlossen, warum auch immer.mit oder ohne anführungszeichen

            Weil das Paket zsh wahrscheinlich nicht installiert ist.

            TC nehme ich den auzuführenden befehl weg und starte

            map f1 launch sh

            kommt leeres fenster mit der anzeige

            sh-5.2$

            Du musst ja auch die bash aufrufen, und nicht sh.

            Das eigentliche Problem besteht darin, dass es entweder keine oder nur genau eine Instanz von kitty gibt, deswegen bringt ein Vergleich gegen den von pgrep gelieferten Zähler nichts; entweder steht er auf 0 wenn kitty nicht gestartet wurde, oder auf 1 wenn es ausgeführt wird, weil Jedes weitere Fenster innerhalb desselben Prozesses von kitty läuft.

            Die Abfrage mit -lt 2 führt immer zu Gleichheit (und damit zur Ausführung von fastfetch), egal ob kitty läuft oder nicht. ein Vergleich gegen 0 würde fastfetch innerhalb von kitty nie ausführen, und ein Vergleich gegen 1 immer. So kommt man also nicht weiter.

            Ein möglicher Ansatz wäre, die Anzahl der Fenster für einen Vergleich heranzuziehen, dazu bietet sich die Variable KITTY_WINDOW_ID an, die mit Öffnen jedes weiteren Fensters inkrementiert wird.

            Für die .bashrc sähe die Modifikation dann so aus:

            if [ $(pgrep -c "kitty") == 0 ] ; then fastfetch ; fi
            if [ "$KITTY_WINDOW_ID"  == 1 ] ; then fastfetch ; fi

            Die erste Zeile sorgt dafür, dass fastfetch in jeder bash-Session ausgeführt wird, einschränkend aber nur dann, wenn kitty nicht läuft. Wenn fastfetch nicht bei Start einer bash-Session ausgeführt werden soll, kann man auf diese Zeile verzichten. Die zweite Zeile führt fastfetch nur dann aus, wenn KITTY_WINDOW_ID den Wert 1 hat, also nur im ersten Fenster, in allen weiteren Fenstern dann nicht mehr.

            Der Eintrag in kitty.conf für die Belegung von F1 müsste dann so aussehen: map f1 launch bash

            • TC und Dirk haben auf diesen Beitrag geantwortet.
              • Bearbeitet

              Martin-MS Du musst ja auch die bash aufrufen, und nicht sh

              das war nur als beispiel für den shortcut, weil ich versucht habe das problem über die config zu lösen. ich hatte verpennt bash einzusetzten statt sh
              und danke das einem noob wir mir so tapfer weiter helft. ich weis das zu schätzen...

              Martin-MS if [ $(pgrep -c "kitty") == 0 ] ; then fastfetch ; fi
              if [ "$KITTY_WINDOW_ID" == 1 ] ; then fastfetch ; fi

              DAS GEHT!!!!! jippi skippi

              und weil mir meine unwissenheit nachträgt werde ich mich jetzt wohl mal (wieder) mit programmierung
              beschäftigen.

              tausend dank an alle die mir geholfen haben

              Man könnte es noch etwas optimieren:
              if [ "$KITTY_WINDOW_ID" = "1" ] || [ "$KITTY_WINDOW_ID" = "" ] ; then fastfetch ; fi

              Das würde die Modifikation der .bashrc auf eine Zeile reduzieren und fastfetch würde bei jedem Start eines bash-Prozesses wieder ausgeführt, weil die bisherige Bedingung $(pgrep -c "kitty")entfällt und somit auch bei schon einem laufenden kitty-Prozess ausgeführt wird.

              Somit wird fastfetch ausgeführt, wenn die Variable KITTY_WINDOW_ID den Inhalt 1 hätte (erstes kitty-Fenster) oder unbelegt wäre (bash-Session).

              Martin-MS Das eigentliche Problem besteht darin, dass es entweder keine oder nur genau eine Instanz von kitty gibt

              Warte mal, alle kitty-Fenster laufen im gleichen Prozess? Das ist ja wahnsinnig! 😃 Aber schön, dass es mit $KITTY_WINDOW_ID eine Lösung gibt.