Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
05.08.2021, 06:18:22

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25805
  • Letzte: antaresc
Statistiken
  • Beiträge insgesamt: 748239
  • Themen insgesamt: 60197
  • Heute online: 412
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online
Mitglieder: 5
Gäste: 235
Gesamt: 240

Autor Thema:  bash, Coderevision: Zum Zwecke der Fehlerminimierung, Erhöhung von Robustheit  (Gelesen 1336 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Wenn du zufrieden bist - wenn deine Anwendung macht, was du beabsichtigst, ist alles OK.
Wie gesagt, es gibt keine Pflicht, den Hinweisen der Prüfung durch shellcheck zu folgen.
Ich betrachte mich bei dem Thema Programmierung als blutiger Laie und bin geneigt im Normalfall der Empfehlung von Shellcheck zu folgen.

Ich habe noch eine Hand voll von Fehlern die etwas komplexer sind. Da muß ich aber erst noch gucken wozu das genau gut war um eine halbwegs sinnvolle Frage formulieren zu können. Fünfundneunzig Prozent von Hinweisen von Shellcheck konnte ich erstaunlicher Weise per von Shellcheck in der Onlineversion verlinkten Fehlerbeschreibungen ohne weitere Hilfe selber lösen. Mit Shellcheck hast du mir eine wunderbare Sache gezeigt. Danke.
« Letzte Änderung: 02.02.2021, 22:34:51 von Jan.Tenner »

Folgend ein Codestück was generell durchaus funktioniert, bei dem aber das Verbesserungspotential größer ist und was zu den 5% der mir durch Shellcheck reporteten Fälle gehört, wo ich nicht so richtig weiß was man da am besten macht.

Codestück 005:
#!/bin/bash

echo Ermittlung von Profileordner
firefox_ordner=/home/user/.mozilla/firefox

    if [[ $(grep '\[Profile[^0]\]' "$firefox_ordner"/profiles.ini) ]]
    then firefox_profil_ordner=$(grep -E '^\[Profile|^Path|^Default' "$firefox_ordner"/profiles.ini | grep -1 '^Default=1' | grep '^Path' | cut -c6-)
    else firefox_profil_ordner=$(grep 'Path=' "$firefox_ordner"/profiles.ini | sed 's/^Path=//')
    fi

    echo "$firefox_profil_ordner"
    echo; echo 

echo "Zum Beenden Enter drücken oder Ctl + C"; read -r

Bei obigen Code bekomme ich mit Shellsheck folgende Fehlermeldungen:

if [[ $(grep '\[Profile[^0]\]' profiles.ini) ]]
       ^-- SC2143: Use grep -q instead of comparing output with [ -n .. ].

if [[ $(grep '\[Profile[^0]\]' profiles.ini) ]]
      ^-- SC2143: Use grep -q instead of comparing output with [ -n .. ].

Shellcheck Fehlerhinweise:
* Fehler SC2143: https://github.com/koalaman/shellcheck/wiki/SC2143
« Letzte Änderung: 03.02.2021, 21:26:36 von Jan.Tenner »

Bei obigen Code bekomme ich mit Shellsheck folgende Fehlermeldungen:

if [[ $(grep '\[Profile[^0]\]' profiles.ini) ]]
       ^-- SC2143: Use grep -q instead of comparing output with [ -n .. ].

if [[ $(grep '\[Profile[^0]\]' profiles.ini) ]]
      ^-- SC2143: Use grep -q instead of comparing output with [ -n .. ].

Shellcheck Fehlerhinweise:
* Fehler SC2143: https://github.com/koalaman/shellcheck/wiki/SC2143
Ich würde folgendes verstehen:

Du lässt dir in der if Zeile einen Ausgabe String vom grep Kommando schreiben und testest dann, dass dieser Ausgabe String nicht leer ist if [[ –n "$str" ]].
Die Empfehlung ist, auf die String Ausgabe und den String Test zu verzichten. Ungefähr einfach so if grep -q "\[Profile[^0]\]" "profiles.ini"; then

Was soll das Programm leisten? Irgendein Profile außer [Profile0] finden? Ich habe es nicht verstanden.

Was soll das Programm leisten? Irgendein Profile außer [Profile0] finden? Ich habe es nicht verstanden.
Das Programm soll mir das aktive Profil des FF aus geben.

Mittlerweile habe ich einen verbesserten Kandidaten der bei Verwendung das gewünschte Profil aus gibt. Bei dieser ist die Lösung kürzer und ich bekomme bei Shellsheck auch nur noch eine Fehlermeldung, die ich allerdings noch nicht weg bekommen habe.
#!/bin/bash
variable=$(cat .mozilla/firefox/profiles.ini | sed -n -e 's/^.*Path=//p' | head -n 1)
echo "$variable"
echo "Zum Beenden Enter drücken oder Ctl + C"; read -r

Fehlermeldung laut Shellcheck:
variable=$(cat .mozilla/firefox/profiles.ini | sed -n -e 's/^.*Path=//p' | head -n 1)
               ^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.

Link zur Fehlererklärung:
* https://github.com/koalaman/shellcheck/wiki/SC2002

Ich werde da mal als nächstes sehen, ob das besser wird wenn ich den Pfad da etwas anders an gebe.
« Letzte Änderung: 04.02.2021, 15:24:42 von Jan.Tenner »

Was soll das Programm leisten? Irgendein Profile außer [Profile0] finden? Ich habe es nicht verstanden.
Das Programm soll mir das aktive Profil des FF aus geben.
Ich kenne das Format und die Verarbeitung der Datei profiles.ini nicht. Das findet sich sicher im Netz - da muss man mal nachsehen. Ggf. muss man Default=1 und / oder StartWithLastProfile=1 auswerten, um das aktive Profil zu ermitteln. Einfach einen Path= zu finden ist vielleicht zu wenig?

Fehlermeldung laut Shellcheck:
variable=$(cat .mozilla/firefox/profiles.ini | sed -n -e 's/^.*Path=//p' | head -n 1)
               ^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.

Link zur Fehlererklärung:
* https://github.com/koalaman/shellcheck/wiki/SC2002

Ich werde da mal als nächstes sehen, ob das besser wird wenn ich den Pfad da etwas anders an gebe.
Da steht aber nicht, dass du den Pfad anders angeben sollst. Da steht vielmehr, du möchtest auf das cat Kommando verzichten.

Ich kenne das Format und die Verarbeitung der Datei profiles.ini nicht. Das findet sich sicher im Netz - da muss man mal nachsehen. Ggf. muss man Default=1 und / oder StartWithLastProfile=1 auswerten, um das aktive Profil zu ermitteln. Einfach einen Path= zu finden ist vielleicht zu wenig?
Mittlerweile habe ich eine Lösung gefunden. Sie lautet:
#!/bin/bash

pfad="/home/user/.mozilla/firefox/profiles.ini"

variable="$( sed -n -e 's/^.*Path=//p' < "$pfad" | head -n 1)"
echo Die Bezeichnung des aktiven Profiles lautet: "$variable"

echo "Zum Beenden Enter drücken oder Ctl + C"; read -r

OK soweit.
Was ich aber sagen wollte. Wieso ist der erste Path= Treffer zwingend das aktive FF Profil?
Anders gesagt, garantiert die Datei profiles.ini, dass das aktive FF Profil der erste Path= Treffer ist.
Anders gesagt, liefert dein Skript das gesuchte aktive FF Profil für alle möglichen Ausprägungen in profiles.ini? In meiner eigenen profiles.ini steht nicht viel drin. Wie sieht es aus, wenn andere 20 FF Profile haben. Liefert dein Skript dann eindeutig das aktive FF Profil?

OK soweit.
Was ich aber sagen wollte. Wieso ist der erste Path= Treffer zwingend das aktive FF Profil?
Anders gesagt, garantiert die Datei profiles.ini, dass das aktive FF Profil der erste Path= Treffer ist.

Das ist ein interessanter Punkt, den ich noch näher beleuchten muss. Im Moment kämpfe ich damit einen Rückgabewert aus der Funktion zu bekommen, die ich daraus gemajcht habe.

Folgendes funktioniert:
#!/bin/bash

# Funktion fkt_get_aktives_ff_profil pfad_zur_profile_ini
##################################################
fkt_get_name_von_firefox_profil_ordner() {

        pfad_zur_profile_ini=$1 # Pfad zur Datei profil.ini       

        firefox_profil_ordner="$( sed -n -e 's/^.*Path=//p' < "$pfad_zur_profile_ini" | head -n 1)"
    }

fkt_get_name_von_firefox_profil_ordner /home/user/.mozilla/firefox/profiles.ini # geht
echo "$firefox_profil_ordner" # geht

echo "Zum Beenden Enter drücken oder Ctl + C"; read -r

Verbesserungsvorschläge zu obigen Code sind willkommen. Evtl. sollte man z.B. die Ausgabe bei einer Funktion anders machen als ich es gemacht habe.
« Letzte Änderung: 05.02.2021, 15:16:05 von Jan.Tenner »

#!/bin/bash

# Funktion fkt_get_aktives_ff_profil pfad_zur_profile_ini
##################################################
fkt_get_name_von_firefox_profil_ordner() {
        pfad_zur_profile_ini=$1 # Pfad zur Datei profil.ini       
        firefox_profil_ordner="$( sed -n -e 's/^.*Path=//p' < "$pfad_zur_profile_ini" | head -n 1)"
        echo "$firefox_profil_ordner"
}
# so
fkt_get_name_von_firefox_profil_ordner /home/pinky/.mozilla/firefox/profiles.ini
# oder so
wert=$(fkt_get_name_von_firefox_profil_ordner /home/pinky/.mozilla/firefox/profiles.ini)
echo "$wert"