Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';' [Gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';' [Gelöst]

Beitrag von jmar83 » 02.05.2022 11:59:51

Es geht um ein Shell-Skript: Da kann man scheinbar machen was man will, Leerzeichen hin oder her, es endet ständig in einem Syntaxfehler...

Muss man da was mit $(... &); machen oder so?

Code: Alles auswählen

eatmydata -- apt-get install -y --force-yes libmysqlcppconn-dev libcurl4-openssl-dev libssl-dev libssl-dev libssl1.1 libssl-dev libssh2-1 libssh2-1-dev libcrypto++-dev libtinyxml-dev libtinyxml2-dev libboost-all-dev &;
Besten Dank für eure Feedbacks! :-)
Zuletzt geändert von jmar83 am 02.05.2022 16:23:31, insgesamt 1-mal geändert.
Freundliche Grüsse, Jan

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von jmar83 » 02.05.2022 12:01:27

->

Code: Alles auswählen

root@build-raspi:~/deployment# apt-get install dos2unix&;
-bash: Syntaxfehler beim unerwarteten Wort `;'
root@build-raspi:~/deployment# apt-get install dos2unix & ;
-bash: Syntaxfehler beim unerwarteten Wort `;'
root@build-raspi:~/deployment# apt-get install dos2unix; &
-bash: Syntaxfehler beim unerwarteten Wort `&'
Freundliche Grüsse, Jan

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von jmar83 » 02.05.2022 12:03:45

Oder: WEIL es ein Prozess-Fork ist, darf kein Abschlusszeichnen, in diesem Falle ein ';' verwendet werden - es das evtl. Fakt und "Stand der Dinge"...?

Also gerade deswegen...!?
Freundliche Grüsse, Jan

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von Meillo » 02.05.2022 12:17:22

Das & *ersetzt* den ;

Es separiert Kommandos in gleicher Weise. Der Unterschied ist nur, dass nach ; erst weiter ausgefuehrt wird wenn das vorige Kommando fertig ist, wohingegen bei & das vorige Kommando im Hintergrund laeuft und direkt das naechste Kommando ausgefuehrt wird.

Z.B.

Code: Alles auswählen

sleep 30 & sleep 10 & sleep 20 &
Use ed once in a while!

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von JTH » 02.05.2022 12:19:22

Entweder ; (wo es nicht optional ist) oder &. Beides ist syntaktisch falsch – also „Fakt“, wenn du so willst.

Code: Alles auswählen

echo Hi
echo Hi;            # Überflüssig, unüblich
echo Hi; echo Ho
echo Hi; echo Ho &
echo Hi & echo Ho &
echo Ha & echo Ho; echo He &
echo Ha & echo Ho & echo He & echo
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
hikaru
Moderator
Beiträge: 13896
Registriert: 09.04.2008 12:48:59

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von hikaru » 02.05.2022 12:28:23

Laut [1] sind in bash leere Kommandos nicht erlaubt. Daher kommt die eigentliche Fehlermeldung:

Code: Alles auswählen

$ ;
bash: syntax error near unexpected token `;'
$ &
bash: syntax error near unexpected token `&'
Bonusfrage: Warum geht dann ein simples Enter ohne Fehlermeldung?: Das ist doch auch ein leeres Kommando, oder etwa nicht?


[1] https://superuser.com/questions/269429/ ... or-in-bash

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von JTH » 02.05.2022 12:55:16

hikaru hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 12:28:23
Bonusfrage: Warum geht dann ein simples Enter ohne Fehlermeldung?: Das ist doch auch ein leeres Kommando, oder etwa nicht?
Interessante Frage :)

Rein technisch gesehen: Vielleicht verhält sich die Shell, wenn interaktiv gestartet, einfach durch Verwendung von readline o.ä. anders.

Aber ich denk, das kann man auch syntaktisch begründen: Der Beschreibung der Shell Grammar Rules in POSIX nach besteht ein (Shell-) Programm aus (ein Stück weiter unten):
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10_02 hat geschrieben:

Code: Alles auswählen

/* -------------------------------------------------------
   The Grammar
   ------------------------------------------------------- */
%start program
%%
program          : linebreak complete_commands linebreak | linebreak;
Das Semikolon ist hier Teil der Darstellung der Grammatik, nicht das Semikolon aus dem Shellcode. Ein Shellprogramm besteht demnach aus einer Aneinanderreihung von Zeilen mit Kommandos (das meint simple Kommandos, Pipelines und alles weitere) mit einem Zeilenumbruch am Ende – oder leeren Zeilen, die nur einen Zeilenumbruch enthalten. (Hoffe, ich lese das noch richtig.)

Das erklärt zumindest recht einleuchtend, warum ein Shellskript beliebig leere Zeilen enthalten kann.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von Meillo » 02.05.2022 12:58:51

In der Unix Shell ist generell alles so weil es halt so ist. Die Shell basiert nicht unbedingt viel auf Logik. Die meisten Erklaerungen und Konzepte sind nachtraeglich darueber gelegt worden, so auch die EBNF-Grammatik in POSIX: https://pubs.opengroup.org/onlinepubs/9 ... #tag_18_10

Hier die relevanten Abschnitte aus der Grammatik-Definition.

Hier warum leere Zeilen erlaubt sind:

Code: Alles auswählen

program          : linebreak complete_commands linebreak
                 | linebreak
                 ;
complete_commands: complete_commands newline_list complete_command
                 |                                complete_command
                 ;
                 
newline_list     :              NEWLINE
                 | newline_list NEWLINE
                 ;
Und hier wie es sich mit & und ; verhaelt:

Code: Alles auswählen

complete_command : list separator_op
                 | list
                 ;
list             : list separator_op and_or
                 |                   and_or
                 ;

separator_op     : '&'
                 | ';'
                 ;
Zwei separator_op hintereinander gehen nicht.


Das erklaert warum die Shell sich so verhaelt (sie verhaelt sich kompatibel zur Bourne-Shell und zu POSIX), aber es erklaert nicht was der Grund ist, warum sie sich so verhaelt (weil das der Willkuer von Ken Thompson, Steven Bourne, David Korn und weiteren geschuldet ist).


Edit: JTH war schneller. ;-)
Use ed once in a while!

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von jmar83 » 02.05.2022 16:11:16

Hallo zusammen

Vielen Dank für die Feedbacks! :-)

"Warum geht dann ein simples Enter ohne Fehlermeldung?"

-> In der Konsole das Selbe wie im Skript: "Syntax error"...
Freundliche Grüsse, Jan

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';'

Beitrag von JTH » 02.05.2022 18:48:11

jmar83 hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 16:11:16
"Warum geht dann ein simples Enter ohne Fehlermeldung?"

-> In der Konsole das Selbe wie im Skript: "Syntax error"...
hikaru meinte da eine komplett leere Eingabe, selbst ohne das Semikolon oder Ampersand.
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: Prozess-Fork [&-Operator] bei Shell-Skripts in Kombination mit ';' [Gelöst]

Beitrag von jmar83 » 03.05.2022 10:15:46

Vielen Dank!! :THX:
Freundliche Grüsse, Jan

Antworten