hikaru hat geschrieben: 13.08.2021 09:36:49
Meillo hat geschrieben: 13.08.2021 08:19:33
Wir wollten urspruenglich doch nur wissen *warum* bzw. *worueber* Systemd in die Abhaengigkeit gezogen wird.
fischig wollte außerdem wissen, ob es eine Möglichkeit gibt, Systemd zu umschiffen (die "Landschaftsroute" aus meinem letzten Beitrag). Das leistet bisher keine der präsentierten Lösungen.
Meillo hat geschrieben: 13.08.2021 08:19:33
Das Gewicht der Pfade hat in dieser Fragestellung doch keine Relevanz.
Doch, implizit. Im Prinzip wollen wir alle (und fischig im Besonderen) ein möglichst schlankes System. Die Gewichte in Form der Paketgrößen zu berücksichtigen wäre der algorithmische Ausdruck dieses Wunsches.
Meillo hat geschrieben: 13.08.2021 08:19:33
Das ist aber eine ganz andere Fragestellung.
Das ist mir zu akademisch. Es ist ein bisschen so, als würde ich dich fragen, ob du mir die Uhrzeit sagen kannst, und deine Antwort lautet: "Ja."
Natürlich wäre das die formal korrekte Antwort auf meine Frage. Aber eigentlich hätte ich erwartet, dass du mir die Uhrzeit sagst, auch wenn das streng genommen nicht meine Fragestellung war.
Lustig, weil ich wuerde sagen, dass das pragmatisch ist: Divide and Conquer bzw. One tool, one job. Wer wuerde zwei so unterschiedliche Fragestellungen, auch wenn sie im gleichen Anwendungskontext aufkommen, in einem Aufwasch erschlagen wollen?
Meillo hat geschrieben: 13.08.2021 08:19:33
Generell gesprochen macht man eine absteigende Ausgabe in der Rekursion so:
[..]
D.h. die Ausgabe vor dem Rekursionsaufruf oder die Ausgabe nachdem er zurueckgekehrt ist.
Wie gesagt, ich habe bei der Ausgabe des Endpakets geschummelt, denn ich gebe es nicht innerhalb der Rekursion aus, weil diese damit beginnt, den vorherigen Knoten des Endpakets zu ermitteln. Daher ist es nicht trivial, innerhalb des Scripts die Ausgabe umzukehren.
[...]
Meillo hat geschrieben: 13.08.2021 08:30:54
In deinem Fall hast du nur genau ein einziges Script, das sich komplett selber aufruft. Das macht es unhandlicher.
Ja. Das ganze Script ist im Grunde nur ein Wrapper um die grep-Zeile.
Meillo hat geschrieben: 13.08.2021 08:30:54
Wenn man keine zwei Funktionen/Scripte haben kann/will, dann kann man sich auch damit behelfen, dass man durch eine Variable herausfindet, ob man auf der nullten Rekursionsstufe ist und nur dort irgendwelchen Zusatzcode ausfuehrt.
Genau das mache ich bereits über die Anzahl der übergebenen Argumente um herauszufinden, ob ich neue Hilfsdateien anlegen muss oder die bereits erzeugten nutzen soll.
Ich glaube hier werden unsere unterschiedlichen Ansätze deutlich:
Ich bin Techniker. Ich will für ein gegebenes Problem eine möglichst einfache Lösung haben. "Einfach" bedeutet hier, so wenig Aufwand wie möglich in die Lösung zu investieren. Diese Lösung habe ich und die Reihenfolge die Ausgabe sowie die Eleganz des Codes sind für mich eher nebensächlich.
Du bist Akademiker. Du stebst eine "Schulbuchlösung" an, auch wenn das bedeutet, zusätzliche Arbeit in die Schönheit des Codes und der Ausgabe zu investieren. "Schönheit" in diesem Kontext ist oft nahe verwandt mit Zukunftssicherheit (Funktionen, vollständig rekursive Ausgabe).
Beide Ansätze haben ihre Berechtigung. Sieh meine Lösung als "Proof of Concept"!
Ich glaube nicht, dass ich mich deiner Sichtweise anschliessen will. Ja, ich bin Akademiker und ich nutze dieses Wissen und diese Sichtweise um die vorliegenden Probleme und Wuensche zu analysieren und in diesem Zuge voran zu kommen. Ich strebe nicht zwangslaeufig Schulbuchloesungen an, aber ich nutze mein Schulbuchwissen um Loesungen zu finden ... die in dieser Betrachtungsweise oft einfacher zu finden werden.
Zugegeben, ich begnuege mich nicht damit, wenn irgendein Output kommt, sondern ich will ihn schon in der besten Form haben, wenn dafuer keine hoehere Komplexitaet noetig ist, sondern nur eine (mir durch mein akademisches Wissen ermoeglichte) Umarrangierung des Codes.
Dank des von dir geposteten Outputs konnte ich das nun selber testen. (Ich musste eine Anpassung machen, damit es auf FreeBSD lief: sed kennt normalerweise kein `\+', darum habe ich `.\+' durch das aequivalente `..*' ersetzt.)
Hier eine Umsetzung mit umgekehrter Ausgabe, die deinem Aufbau entspricht:
Code: Alles auswählen
#!/bin/sh
START=$1
END=$2
if [ $# -lt 3 ]
then
DKS=${START}.dks
debtree --no-alternatives $START 2>/dev/null > ${START}.dot
dijkstra -dp $START ${START}.dot > $DKS
else
DKS=$3
fi
egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/..*prev=//' | tr -d '",;]' | while read PKG
do
if [ "$PKG" != "$START" ]
then
$0 $START $PKG $DKS
fi
echo $PKG
done
if [ $# -lt 3 ]
then
echo $END
fi
(`echo $PKG' hinter der Rekursion und `echo $END' am Ende.)
Und hier eine Version mit Hilffunktion:
Code: Alles auswählen
#!/bin/sh
START=$1
END=$2
DKS=${START}.dks
recurse() {
START=$1
END=$2
DKS=$3
egrep -A 1 "(\s|\")$END(\s|\").*\[dist" $DKS | tail -n 1 | sed 's/..*prev=//' | tr -d '",;]' | while read PKG
do
if [ "$PKG" != "$START" ]
then
recurse $START $PKG $DKS
fi
echo $PKG
done
}
debtree --no-alternatives $START 2>/dev/null > ${START}.dot
dijkstra -dp $START ${START}.dot > $DKS
recurse $START $END $DKS
echo $END
Hier wird der Code IMO deutlich lesbarer. Das meinte ich mit dem Ansatz, dass man bei einer Rekursion immer zwei Funktionen hat, eine fuer die Rekursion selbst und eine (bzw. das Hauptprogramm) fuer das Drumherum. Das ist vermutlich immer einfacher als wenn der komplette Code rekursiert.
Man koennte sagen, dass mir hier mein akademisches Wissen hilft, die Sache klarer zu sehen ... dabei ist es hier aber gar kein akademisches Wissen (sondern nur akademisches Backgroundwissen), da mich das die Praxis gelehrt hat. (Akademisch ist nur an welcher Stelle man die Ausgabe machen muss, je nachdem in welcher Reihenfolge man sie haben will.)
Edit: Ich finde es nicht schlimm wenn nicht jeder dieses Wissen und diese Faehigkeiten hat. Mir selbst fehlen sie in theoretischen Bereichen oft genug selbst. (Dijkstra -- nie gehoert ... also den Algorithmus, denn die Person und seine Denkweisen kenne ich schon ganz gut.
) Dafuer haben wir ja zum Glueck andere Personen, die das beisteuern koennen was man selbst nicht so gut kann oder nicht so einfach sieht.