Das Shell-builtin `set'

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Das Shell-builtin `set'

Beitrag von Meillo » 22.01.2009 14:20:24

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.
Use ed once in a while!

Benutzeravatar
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'

Beitrag von Natureshadow » 22.01.2009 18:08:40

Hallo,

set wird zur Manipulation der Umgebung der Shell benutzt. Was willst du da jetzt mit Stringmanipulation?

Grüße,
Nik

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

Re: Das Shell-builtin `set'

Beitrag von Meillo » 22.01.2009 19:40:06

Natureshadow hat geschrieben:set wird zur Manipulation der Umgebung der Shell benutzt. Was willst du da jetzt mit Stringmanipulation?
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.)


Bezüglich des Problems im verlinkten Thread:

Code: Alles auswählen

line="hund katze"
set $line
echo $2 $1
So kann ich eine Zeile (also ein String) bearbeiten. Wenn ich jetzt noch die IFS-Variable zur Hilfe nehme bin ich noch flexibler.


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!

Benutzeravatar
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'

Beitrag von Natureshadow » 22.01.2009 20:17:36

Hi,

ich weiß immer noch nicht, was der Code am Ende machen soll ;)

-nik

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

Re: Das Shell-builtin `set'

Beitrag von Meillo » 22.01.2009 20:34:39

Natureshadow hat geschrieben:ich weiß immer noch nicht, was der Code am Ende machen soll ;)
Genau das was im verlinkten Thread beschrieben ist. Noch genauer: Das was der Code im verlinkten Post auch macht.

Das Programmierzeugs ist aber nur nebensächlich. Viel wichtiger sind mir Informationen zu der Thematik.
Use ed once in a while!

Benutzeravatar
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'

Beitrag von Natureshadow » 22.01.2009 20:54:45

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

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

Re: Das Shell-builtin `set'

Beitrag von Meillo » 22.01.2009 21:25:58

Natureshadow hat geschrieben:Wenn du das hier nicht vernünftig erklären magst, kann ich dir auch nicht helfen.
Hast du dir den anderen Thread durchgelesen? Hast du mein Code-Beispiel hier oben gesehen? Was gibt's denn daran nicht zu verstehen?
set manipuliert die Umgebung der Shell.
Ja. Und unter anderem legt es übergebene Argumente in $1 bis $9 ab. Diese Funktion ist hier die Relevante.
read liest eine Zeile von stdin und legt sie in eine Variable in der Umgebung.
Das ist prinzipiell das gleiche nur dass explizit angegebene Variablen verwendet werden.

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
Ein Beispiel mit `set', aber mit nur einer Zeile habe ich schon geliefert:
Meillo hat geschrieben:

Code: Alles auswählen

line="hund katze"
set $line
echo $2 $1
(Selbstzitat ... oh mann)

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!

Benutzeravatar
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'

Beitrag von Natureshadow » 22.01.2009 21:42:51

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:

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
a.txt ist die Datei mit den Paaren.

-nik

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Das Shell-builtin `set'

Beitrag von habakug » 22.01.2009 21:46:37

Hallo!
set manipuliert die Umgebung der Shell.
Nicht nur das, es kann auch noch dies [1]:
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.
Example 14-17 könnte das Problem lösen, oder wie schon im oben genannten Beispiel auch als Variable:

Code: Alles auswählen

#!/bin/bash
variable="one two three four five"
set -- $variable
# Sets positional parameters to the contents of "$variable".
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
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Antworten