Befehl forken wenn `&&` oder `;` im Befehl sind [Gelöst]

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Befehl forken wenn `&&` oder `;` im Befehl sind [Gelöst]

Beitrag von jmar83 » 30.11.2020 17:09:44

Hallo zusammen

Folgendes geht nicht:

1.) apt-get update ||: && apt-get clean && $(apt-get autoremove --purge > /dev/null 2>&1) &;
2.) apt-get update ||: && apt-get clean && apt-get autoremove --purge > /dev/null 2>&1 &;



Geht:

Code: Alles auswählen

apt-get update ||: && apt-get clean;
autoremove --purge > /dev/null 2>&1 &

Ist das überhaupt möglich, beim Forken `&&` (zwischen den Befehlen) oder ein `;` (am Ende) zu verwenden?

Vielen Dank für die Feedbacks.
Zuletzt geändert von jmar83 am 01.12.2020 15:06:24, insgesamt 1-mal geändert.
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 30.11.2020 17:15:42

Problem vorerst so gelöst, aber evtl. gibt noch einen eleganteren weg?

Code: Alles auswählen

apt-get update ||: && apt-get clean && $(apt-get autoremove --purge > /dev/null 2>&1 &);
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 30.11.2020 17:49:53

Das hier geht aber nicht - kann wieder mal keinen rationalen Grund erkennen warum es nicht geht:


Code:

Code: Alles auswählen

$(apt-get install --yes --force-yes dos2unix &);

Ausgabe:

Code: Alles auswählen

++ apt-get install --yes --force-yes dos2unix
+ Paketlisten werden gelesen... Abhängigkeitsbaum wird aufgebaut.... Statusinformationen werden eingelesen.... dos2unix ist schon die neueste Version '(7.3.4-3).' 0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
./test.sh: Zeile 52: Paketlisten: Kommando nicht gefunden.
Freundliche Grüsse, Jan

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von JTH » 30.11.2020 19:14:18

Hmm, um dir ganz sinnvoll zu helfen, müsstest du vllt verraten, was genau du erreichen willst. Mehrere, nicht nur lesende apt-get-Aufrufe parallel laufen zu haben dürfte nicht möglich sein.

jmar83 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 17:09:44
Folgendes geht nicht:

1.) apt-get update ||: && apt-get clean && $(apt-get autoremove --purge > /dev/null 2>&1) &;
2.) apt-get update ||: && apt-get clean && apt-get autoremove --purge > /dev/null 2>&1 &;
Das ist auch völlig korrekt so. Die (Ba)sh-Syntax lässt nur entweder ; oder & als Trenner einer Kommandoliste zu. Also entweder

Code: Alles auswählen

echo A; echo B; echo C
# äquivalent zu
echo A
echo B
echo C
oder

Code: Alles auswählen

echo A & echo B & echo C
Siehe
man bash hat geschrieben: Lists
A list is a sequence of one or more pipelines separated by one of the operators ;, &, &&, or ||, and optionally terminated by one of ;, &, or <newline>.
Als Hinweis am Rande: Das ; ist – anders als in anderen Sprachen – nicht notwendig, um eine simple Kommandozeile abzuschließen. Man kann es ans Ende schreiben, muss aber nicht. Und es eher üblich, es nicht ans Ende zu schreiben.


jmar83 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 17:49:53
Das hier geht aber nicht - kann wieder mal keinen rationalen Grund erkennen warum es nicht geht:

Code: Alles auswählen

$(apt-get install --yes --force-yes dos2unix &);
Das $() ist eine Kommandosubstitution. Sie wird durch die Ausgaben der aufgelisteten Kommandos ersetzt.

Dieses hier
jmar83 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 17:15:42

Code: Alles auswählen

apt-get update ||: && apt-get clean && $(apt-get autoremove --purge > /dev/null 2>&1 &);
ist also effektiv so, als ob du Folgendes ausführst. Was (hoffentlich offensichtlich) nicht funktioniert:

Code: Alles auswählen

apt-get update ||: && apt-get clean && Paketlisten werden gelesen... Abhängigkeitsbaum wird aufgebaut.... Statusinformationen werden eingelesen.... dos2unix ist schon die neueste Version '(7.3.4-3).' 0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.;
Manchmal bekannt als Just (another) Terminal Hacker.

mcb

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von mcb » 30.11.2020 19:21:29

Bedeutet doch rechts wird nur ausgeführt wenn links einen Fehler ausgibt ?

&& läuft nachdem links return 0 ausgibt ->

ich kenne mich nicht gut aus aber nur && reicht im Beispiel doch ?

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von tobo » 30.11.2020 19:52:33

Bedeutet, dass der 3. Befehl auf jeden Fall (falls 1 oder 2 true sind) ausgeführt wird:

Code: Alles auswählen

$ true || echo 2 && echo 3
3
$ false || echo 2 && echo 3
2
3
Irgendwie ist das alles von hinten durch die Brust ins Auge programmiert!?

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von uname » 01.12.2020 10:29:37

Vielleicht könnte der Threadstarter mal schreiben, was überhaupt das Ziel ist.
Ist es nicht zudem so, dass & und nicht && einen Prozess abspaltet?
Und wenn das ganze Zeug im Hintergrund laufen soll: Warum nicht Debiantmux oder Debianscreen ?
Oder soll es wirklich parallelisiert werden? Und wenn was?

Also am besten mal erklären, was überhaupt erreicht werden soll.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 01.12.2020 10:40:07

Hallo

"Also am besten mal erklären, was überhaupt erreicht werden soll."

Letztendlich ist es relativ simpel: Befehle zusammenhängen mit `&&` und den letzten davon forken mit `&`... welche Befehle spielt meines Erachtens eher ne untergeordnete Rolle.

Danke für die Feedbacks! :-)
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 01.12.2020 10:44:54

Noch mal ein Beispiel:

Code: Alles auswählen

apt-get update ||: && apt-get clean && $(apt-get autoremove --purge &);
Ausgabe:

+ Paketlisten werden gelesen... Abhängigkeitsbaum wird aufgebaut.... Statusinformationen werden eingelesen.... 0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
./test.sh: Zeile 46: Paketlisten: Kommando nicht gefunden.


...wie muss es nun lauten, wenn man einen geforkten Befehl mit `&&` zusammenhängt und am Ende noch ein Semikolon (`;`) setzen will. Geht irgendwie nicht auf die Art, welche ich versuche...(?)
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 01.12.2020 10:46:19

Code: Alles auswählen

 apt-get update ||: && apt-get clean && apt-get autoremove --purge &;

-> "./test.sh: Zeile 46: Syntaxfehler beim unerwarteten Wort `;'"


...damit sollte nun klar sein, was die Kernfrage ist. (?)
Freundliche Grüsse, Jan

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von uname » 01.12.2020 10:47:55

Ok jetzt habe ich es verstanden. Wobei nach dem zweiten Mal lesen ist es dann auch klar geworden.

Ich würde im ersten Schritt mal alles in ein Shell-Script packen und das mit & ausführen.
Nehmen wir mal etwas einfacheres.
Datei script.sh anlegen und chmod 755 script.sh, um es ausführbar zu machen.
Das Script gibt Zahlen von 1 bis 10000 aus. Kannst du gerne noch hochsetzen.

Datei script.sh

Code: Alles auswählen

#!/bin/bash

for i in {1..10000};
do echo $i;
done
Das kannst du starten mit:

Code: Alles auswählen

./script.sh 
./script.sh &
Hier erkennt man schon einen Unterschied.
Bau nun in das Script deine oben angeführten Shellbefehle ein und wiederhole es.
Schreib, wie es dir so ergangen ist.
Wenn dann alles toll läuft, kannst du evtl. die Befehle wieder aus dem Script in eine Shell-Zeile extrahieren.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von uname » 01.12.2020 10:49:24

-> "./test.sh: Zeile 46: Syntaxfehler beim unerwarteten Wort `;'"
Naja ob das im Scirpt möglich ist. .... muss ich mal suchen ...
Scheint zu gehen: https://stackoverflow.com/questions/309 ... ec-in-bash
Nutze mal mehrere Zeilen und lass das dämmliche && und || erst mal weg.
Auch ist das mit dem "purge" komisch. Vielleicht kannst du Klammers setzen.

Warum willst du gerade an der Stelle den Prozess forken?
Was passiert danach?

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von JTH » 01.12.2020 11:07:01

jmar83 hat geschrieben: ↑ zum Beitrag ↑
01.12.2020 10:44:54

Code: Alles auswählen

apt-get update ||: && apt-get clean && $(apt-get autoremove --purge &);
jmar83 hat geschrieben: ↑ zum Beitrag ↑
01.12.2020 10:46:19

Code: Alles auswählen

 apt-get update ||: && apt-get clean && apt-get autoremove --purge &;
Hast du dir meine Antworten durchgelesen? Das ist nicht sinnvoll bzw. das zweite einfach syntaktisch falsch.

Zu deinem Problem:
Die Operatoren && und || haben eine höhere Wertigkeit als ; und &. && und || werden zuerst betrachtet, erst anschließend die & und ;. Damit gilt das & so wie du es schreibst für die komplette Zeile.

Wenn du tatsächlich das letzte Kommando in einer Kommandoliste forken möchtest, müsstest du es in eine Gruppe verpacken:

Code: Alles auswählen

echo A && echo B && { echo C & }
Oder konkret bei dir:

Code: Alles auswählen

apt-get update ||: && apt-get clean && { apt-get autoremove --purge & }

Nachtrag:

Code: Alles auswählen

apt-get update ||: && apt-get clean
Das ist unintuitiv oder zumindest unnötig kompliziert. Das apt-get clean wird so immer ausgeführt, auch wenn apt-get update fehlschlägt. Das kann man aber kürzer haben – genau dafür ist das Semikolon in (Ba)sh da: Um Kommandos unabhängig von ihrem Erfolg oder Fehlschlag nacheinander in einer Zeile auszuführen:

Code: Alles auswählen

apt-get update; apt-get clean
Manchmal bekannt als Just (another) Terminal Hacker.

KP97
Beiträge: 3429
Registriert: 01.02.2013 15:07:36

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von KP97 » 01.12.2020 11:15:03

Ist es so gewünscht, daß der wichtigste Befehl, nämlich apt-get dist-upgrade bzw. apt full-upgrade fehlt? Sonst ergibt diese Befehlskette nicht viel Sinn.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 01.12.2020 11:23:13

Was haben meine Befehle mit einem "dist-upgrade" zu tun? Sehe dabei nix, was etwas damit zu tun haben könnte.

Das ist relativ simpel:

1. Paketquellen aktualisieren
2. Bereits heruntergeladene Sachen bereinigen
3. Nicht mehr genutzte Abhängigkeiten entfernen



Wo ligt hier der Zusammenhang zum "dist-upgrade". Verstehe ich nicht ganz, kann aber auch sein dass ich mich täische. (?)
Freundliche Grüsse, Jan

KP97
Beiträge: 3429
Registriert: 01.02.2013 15:07:36

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von KP97 » 01.12.2020 12:34:15

Es soll also nur die Datenbank aufgefrischt werden und keine Paketaktualisierung vorgenommen werden? Aha.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 01.12.2020 12:50:33

Es geht weniger um APT, sondern eher um `&&`, `&` sowie `||:` ... ;-)
Freundliche Grüsse, Jan

KP97
Beiträge: 3429
Registriert: 01.02.2013 15:07:36

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von KP97 » 01.12.2020 13:33:14

Ja, das ist schon klar, mir ist nur die Befehlskette aufgefallen.
Hätt' ich mal bloß nix gesagt...

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Befehl forken wenn `&&` oder `;` im Befehl sind

Beitrag von jmar83 » 01.12.2020 15:06:01

Keine Sache - vielen Dank euch allen!!! :THX:
Freundliche Grüsse, Jan

Antworten