• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Nachhilfe in Patch

Hallo,

bei der Bitdefender Installation bin ich mal wieder auf den Patch gestoßen
Code:
cat /opt/BitDefender-scanner/var/lib/scan/versions.dat.* | \
awk '/bdcore.so.linux/ {print $3}' | \
while read bdcore_so; do
  sudo touch /opt/BitDefender-scanner/var/lib/scan/$bdcore_so;
  sudo bdscan --update;
  sudo mv /opt/BitDefender-scanner/var/lib/scan/bdcore.so /opt/BitDefender-scanner/var/lib/scan/bdcore.so.old;
  sudo ln -s /opt/BitDefender-scanner/var/lib/scan/$bdcore_so /opt/BitDefender-scanner/var/lib/scan/bdcore.so;
  sudo chown bitdefender:bitdefender /opt/BitDefender-scanner/var/lib/scan/$bdcore_so;
done
Kann mir jemand sagen was passiert hier und wo kann ich eventuell Hilfe zu dem Thema finden? Ich möchte nicht einfach wie eine exe Datei unter Windows ausführen, ohne zu wissen was man eigentlich tut.

Die ersten zwei Zeilen
Code:
cat /opt/BitDefender-scanner/var/lib/scan/versions.dat.* | \
awk '/bdcore.so.linux/ {print $3}' | \
hier wird mit Shell-Befehl cat eine Datei mit dem Namen versions.dat.* (das kann versions.dat.111 oder aber versions.dat.222 u.s.w. sein) geöffnet und in eine Pipe (eine Art Ablage) | geschrieben.
Was aber passiert dann?
Die Zeile unten sagt mir nichts
Code:
 \
awk '/bdciore.so.linux/ {print $3}'
genau wie die Zeile
Code:
while read bdcore_so; do
In der vierten Zeile
Code:
  sudo touch /opt/BitDefender-scanner/var/lib/scan/$bdcore_so;
wird mit Shell-Befehl sudo touch eine neue leere Text Datei mit dem Namen $bdcore_so erzeugt. Was bewirkt aber das Dollarzeichen $ vor bdcore_so und das Semikolon ; am Ende der Zeile?
In der fünften Zeile
Code:
sudo bdscan --update;
wird mit sudo also root-Rechten ein Befehl bdscan --update ausgeführt
und am Ende wieder das Semikolon ; Zeichen :???:
In der sechsten Zeile
Code:
sudo mv /opt/BitDefender-scanner/var/lib/scan/bdcore.so /opt/BitDefender-scanner/var/lib/scan/bdcore.so.old;
wird mit root-Rechten die Datei bdcore.so in bdcore.so.old umbenant
und am Ende wieder das Semikolon ; Zeichen :???:
In der siebten Zeile
Code:
 sudo ln -s /opt/BitDefender-scanner/var/lib/scan/$bdcore_so /opt/BitDefender-scanner/var/lib/scan/bdcore.so;
wird mit Shell-Befehl sudo ln -s, als root ein symbolischer Link zu der Datei bdcore.so erzeugt und schon wieder das mir unbekannte Semikolon ; Zeichen.
 

marce

Guru
Doofe Frage - Du bist seit > 12 Jahren hier angemeldet und verstehst nicht die grundlegendesten Bash-Befehle?

Aber gut:
Die awk-Zeile sucht nach einem Pattern und gibt ein spez. Element davon aus
(http://www.thegeekstuff.com/2010/01/awk-introduction-tutorial-7-awk-print-examples)

Das ganze wird in eine Schleife übergeben und in eine Variable gepackt. $ kennzeichnet eine Variable.
Diese Datei wird getoucht - sofern vorhanden wird der Zeitstempel aktualisiert, wenn nicht, wird sie angelegt.

; ist ein Befehlstrenner.
 
OP
Heinz-Peter
marce schrieb:
Doofe Frage - Du bist seit > 12 Jahren hier angemeldet und verstehst nicht die grundlegendesten Bash-Befehle?
Es gibt nicht doofe Fragen. Ich kenne nur doofe Antworten. Trotzdem danke für Deine Hilfe.

Grüße Heinz-Peter
 

josef-wien

Ultimate Guru
Der Rückwärts-Schrägstrich ist ein Signal, daß der Befehl noch nicht zu Ende ist, sondern in der nächsten Zeile weitergeht. Der Strichpunkt ist ein Signal, daß der Befehl zu Ende ist und ein neuer Befehl beginnt, aber wenn nach dem Strichpunkt ohnehin eine neue Zeile beginnt, ist er unnötig (was im übrigen auch auf die Verwendung von cat zutrifft). awk sucht in jeder Zeile einen regulären Ausdruck (das ist der Begriff zwischen den beiden Schrägstrichen, und ohne die Dateien zu kennen, frage ich mich, warum nach einem regulären Ausdruck gesucht wird, bei dem der Punkt ein beliebiges Zeichen darstellt) und gibt die dritte Spalte dieser Zeile aus. Statt read bdcore_so hätte man auch read blablabla schreiben können, dann müßte halt in den nächsten Zeilen $blablabla statt $bdcore_so stehen, gemeint ist damit die von awk übergebene dritte Spalte. Offensichtlich rechnet das Skript damit, daß der gesuchte reguläre Ausdruck nur ein einziges Mal vorkommt, denn sonst wären die Zeilen mit dem Umbenennen der Datei und dem Anlegen der Verknüpfung etwas fragwürdig. Über die Qualität dieses Skripts müssen Berufenere ein Urteil abgeben, aber solange es funktioniert ...
 
A

Anonymous

Gast
josef-wien schrieb:
Der Rückwärts-Schrägstrich ist ein Signal, daß der Befehl noch nicht zu Ende ist, sondern in der nächsten Zeile weitergeht.
Sinngemäß richtig, aber bisschen ungenau erklärt, ein Signal ist was ganz anderes.
Am Ende der Zeile steht ein Zeilensprung-Zeichen, eines ( und das häufigste) von vielen Sonderzeichen. Das Zeichen hat den offiziellen Namen "Line Feed" hat den Wert 10 oder Hexadezimal 0x0a . Das ist auch das Zeichen das beim Betätigen der Entertaste an den Rechner weitergegeben wird. Die Shell wird dieses Zeichen dann auch als Zeilenende erkennen.
Ein \ direkt vor einem Sonderzeichen, bewirkt das das Sonderzeichen für die Shell hier maskiert ist, bedeutet das Sonderzeichen wird dann von der Bash nicht verarbeitet und die Sonderfunktion ist an dieser Stelle außer Kraft gesetzt. Das Sonderzeichen wird damit an dieser Stelle ignoriert als wenn es gar nicht da wäre, das \ hat seine Aufgabe erfüllt und wird auch während der Bearbeitung der Zeile entfernt.
Ein \ vor einem normalem Zeichen, da wird dann nicht etwa das normale Zeichen ignoriert, sondern da wird nur das \ ignoriert.
Wenn man eine einzige Zeile der Übersichtlichkeit halber in mehrere Zeilen schreiben will, kann man dieses ausnutzen, in dem man an den Zeilenenden die man haben will aber die nicht von der Shell erkennt werden sollen jeweils am ende der Zeile ein \ setzt, (Vorsicht dahinter darf kein Leerzeichen mehr sein, sonst würde das \ vor dem Leerzeichen ignoriert und nicht etwa das Line feed)
wenn man also zB. in der Kommandozeile folgendes eingibt
Code:
fire\
fox
wird dieses von der Shell genauso erkannt und interpretiert, als wenn man
Code:
firefox
in einer Zeile eingeben würde.

josef-wien schrieb:
Über die Qualität dieses Skripts müssen Berufenere ein Urteil abgeben, aber solange es funktioniert ...
Das ist Niveau in etwa nach 10 Stunden Bash-Programmiererfahrung, "useless use of cat" , nicht abgesicherte Variabelverwendung, Dateien anlegen/verschieben/..... ohne zu prüfen ob sie eventuell schon existieren, ungenau bis fehlerhafte reguläre Ausdrücke, nicht durchdachte Scheifensteuerung mit ungeprüften Werten (was passiert hier im Script zB wenn es 2 Dateien versions.dat.irgendwas gibt, zB eine Old-Version, oder was passiert wenn es eine solche Datei gar nicht gibt?), keine Absicherung vor Änderungen am System wenn vorher Befehle auf Fehler laufen, und vor allem die Annahme das auf jedem Rechner jeder User mittels sudo Alles machen darf ....

Aber das steht hier nicht zur Debatte, das scheint ein Userscript zu sein und hoffentlich nichts offizielles was sich irgendwo in einem richtigem Paket befindet.

robi
 
OP
Heinz-Peter
Danke an @josef-wien und an @robi für die Nachhilfe in Patch :thumbs:
Ich markiere den Thread als gelöst.

Grüße Heinz-Peter
 
Oben