Das Shell-builtin `set'
Das Shell-builtin `set'
Ich habe mal gelesen (ich bin mir recht sicher dass es in ``Kuckucksei'' war), dass `set' zum Bearbeiten eines Strings zu verwenden guter/typischer BSD-Style wäre. Wenn ich mich recht erinnere wurde die Verwendung von `read' als schlechter Style abgetan.
Nun ist ``Kuckucksei'' ja eine recht persönliche Sichtweise und deshalb nicht gerade aussagekräftig. Ich kennen kaum diese Verwendung von `set' aus Scripten ... liegt das daran dass wir (GNU/Linuxer) einfach zu sehr von System V geprägt sind ... oder war Clifford Stolls Aussage einfach zu subjektiv?
Weiß da jemand mehr? Hat jemand Erfahrungen gemacht? Wie ist das auf BSD?
Der Auslöser war diese Shellzeile: http://www.debianforum.de/forum/viewtop ... 86#p674186 . Ich hatte damit auch rumgespielt und mich gefragt ob es nicht auch mit `set' ginge und ohne `read' aber über alle Zeilen.
Vorschläge und Kommentare sind herzlich willkommen.
Nun ist ``Kuckucksei'' ja eine recht persönliche Sichtweise und deshalb nicht gerade aussagekräftig. Ich kennen kaum diese Verwendung von `set' aus Scripten ... liegt das daran dass wir (GNU/Linuxer) einfach zu sehr von System V geprägt sind ... oder war Clifford Stolls Aussage einfach zu subjektiv?
Weiß da jemand mehr? Hat jemand Erfahrungen gemacht? Wie ist das auf BSD?
Der Auslöser war diese Shellzeile: http://www.debianforum.de/forum/viewtop ... 86#p674186 . Ich hatte damit auch rumgespielt und mich gefragt ob es nicht auch mit `set' ginge und ohne `read' aber über alle Zeilen.
Vorschläge und Kommentare sind herzlich willkommen.
Use ed once in a while!
- Natureshadow
- Beiträge: 2157
- Registriert: 11.08.2007 22:45:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Radevormwald
-
Kontaktdaten:
Re: Das Shell-builtin `set'
Hallo,
set wird zur Manipulation der Umgebung der Shell benutzt. Was willst du da jetzt mit Stringmanipulation?
Grüße,
Nik
set wird zur Manipulation der Umgebung der Shell benutzt. Was willst du da jetzt mit Stringmanipulation?
Grüße,
Nik
Linux Professional Institute Certification Level 2
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Re: Das Shell-builtin `set'
Der Begriff ``Stringmanipulation'' ist nicht ganz perfekt, aber im entfernten passt er schon. Klar macht `set' noch einiges andere mehr ... mir geht es aber nur um das Setzen von $1 bis $9. (Hätte ich wohl dazu schreiben sollen.)Natureshadow hat geschrieben:set wird zur Manipulation der Umgebung der Shell benutzt. Was willst du da jetzt mit Stringmanipulation?
Bezüglich des Problems im verlinkten Thread:
Code: Alles auswählen
line="hund katze"
set $line
echo $2 $1
1) Kann jemand diesen Ansatz auf eine beliebige Zahle von Zeilen ausweiten -- mir reiner Shell, ohne `read'? (Siehe oben verlinkten Thread)
2) Mir geht es um die Aussage in dem Buch, dass `read' (uncooler) System V-Style ist, `set' dagegen (cooler) BSD-Style. Kann dazu jemand irgendwas sagen?
Use ed once in a while!
- Natureshadow
- Beiträge: 2157
- Registriert: 11.08.2007 22:45:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Radevormwald
-
Kontaktdaten:
Re: Das Shell-builtin `set'
Hi,
ich weiß immer noch nicht, was der Code am Ende machen soll
-nik
ich weiß immer noch nicht, was der Code am Ende machen soll
-nik
Linux Professional Institute Certification Level 2
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Re: Das Shell-builtin `set'
Genau das was im verlinkten Thread beschrieben ist. Noch genauer: Das was der Code im verlinkten Post auch macht.Natureshadow hat geschrieben:ich weiß immer noch nicht, was der Code am Ende machen soll
Das Programmierzeugs ist aber nur nebensächlich. Viel wichtiger sind mir Informationen zu der Thematik.
Use ed once in a while!
- Natureshadow
- Beiträge: 2157
- Registriert: 11.08.2007 22:45:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Radevormwald
-
Kontaktdaten:
Re: Das Shell-builtin `set'
Wenn du das hier nicht vernünftig erklären magst, kann ich dir auch nicht helfen.
set manipuliert die Umgebung der Shell.
read liest eine Zeile von stdin und legt sie in eine Variable in der Umgebung.
-nik
set manipuliert die Umgebung der Shell.
read liest eine Zeile von stdin und legt sie in eine Variable in der Umgebung.
-nik
Linux Professional Institute Certification Level 2
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Re: Das Shell-builtin `set'
Hast du dir den anderen Thread durchgelesen? Hast du mein Code-Beispiel hier oben gesehen? Was gibt's denn daran nicht zu verstehen?Natureshadow hat geschrieben:Wenn du das hier nicht vernünftig erklären magst, kann ich dir auch nicht helfen.
Ja. Und unter anderem legt es übergebene Argumente in $1 bis $9 ab. Diese Funktion ist hier die Relevante.set manipuliert die Umgebung der Shell.
Das ist prinzipiell das gleiche nur dass explizit angegebene Variablen verwendet werden.read liest eine Zeile von stdin und legt sie in eine Variable in der Umgebung.
Vergleiche:
Code: Alles auswählen
echo a b c | read eins zwei drei
echo $zwei
set a b c
echo $2
Im Beispiel geht es darum zwei Worte zu vertauschen. Aus "hallo welt" soll "welt hallo" werden. Alle Zeilen einer Datei bestehen aus einem solchen Paar (wort-leerzeichen-wort).
Gesucht ist ein Befehl (reine Shell, ohne `read') der die Datei einliest und in allen Zeilen die Worte wie gewünscht vertauscht.
Folgender Code kann das, aber halt nur mit `read':
Code: Alles auswählen
<input while read a b ; do echo $b $a ; done
(Selbstzitat ... oh mann)Meillo hat geschrieben:Code: Alles auswählen
line="hund katze" set $line echo $2 $1
Da ich, wie oben schon beschrieben, gelesen habe, dass `set' in der BSD-Welt als besserer Stil angesehen wird (so wird es dort jedenfalls beschrieben), möchte ich wissen:
- ob `set' tatsächlich besser ist
- weshalb diese Aussage macht wurde
- weshalb BSD auf `set' setzt während System V `read' verwendet
- ob diese Aufgabe auch ohne `read' lösbar ist.
Ist diese Wiederholung ausführlich genug?
Sorry, aber ich bin mir sicher, dass alle Informationen schon verständlich vorhanden waren.
Use ed once in a while!
- Natureshadow
- Beiträge: 2157
- Registriert: 11.08.2007 22:45:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Radevormwald
-
Kontaktdaten:
Re: Das Shell-builtin `set'
Hallo,
danke, jetzt konnte ich es sogar in dem Forum lesen in dem ich unterwegs bin und nicht auf gefühlten 38 Seiten in einem anderen.
Ich halte es für groben Unfug, set für sowas zu missbrauchen. Bloß weil es zufällig diese Varaiblen belegt, heißt das noch lange nicht dass man dem Befehl beliebigen Kram übergibt damit man ihn in Variablen bekommt.
Mit reiner Shell wüsste ich da jetzt nichts einfacheres als das hier, ich schaue gerade noch mal:
a.txt ist die Datei mit den Paaren.
-nik
danke, jetzt konnte ich es sogar in dem Forum lesen in dem ich unterwegs bin und nicht auf gefühlten 38 Seiten in einem anderen.
Ich halte es für groben Unfug, set für sowas zu missbrauchen. Bloß weil es zufällig diese Varaiblen belegt, heißt das noch lange nicht dass man dem Befehl beliebigen Kram übergibt damit man ihn in Variablen bekommt.
Mit reiner Shell wüsste ich da jetzt nichts einfacheres als das hier, ich schaue gerade noch mal:
Code: Alles auswählen
i=0
for var in `<a.txt`; do
if [ $i -eq 0 ]; then
a=${var}
i=1
else
b=${var}
i=0
echo "${b} ${a}"
fi
done
-nik
Linux Professional Institute Certification Level 2
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
- habakug
- Moderator
- Beiträge: 4314
- Registriert: 23.10.2004 13:08:41
- Lizenz eigener Beiträge: MIT Lizenz
Re: Das Shell-builtin `set'
Hallo!
Die beiden "--" hinter dem "set" setzen explizit die "positional parameters", ein "set --" löscht sie wieder. Ob das ein besonders guter Stil ist kann ich nicht sagen, es kann aber recht nützlich sein.
Gruß, habakug
[1] http://tldp.org/LDP/abs/html/internal.html#EX34
Nicht nur das, es kann auch noch dies [1]:set manipuliert die Umgebung der Shell.
Example 14-17 könnte das Problem lösen, oder wie schon im oben genannten Beispiel auch als Variable:Another application for it is to reset the positional parameters that a script sees as the result of a command (set `command`). The script can then parse the fields of the command output.
Code: Alles auswählen
#!/bin/bash
variable="one two three four five"
set -- $variable
# Sets positional parameters to the contents of "$variable".
Gruß, habakug
[1] http://tldp.org/LDP/abs/html/internal.html#EX34