Thread wer hat lust auf ein Spiel? (61 answers)
Opened by conray at 2010-02-19 20:31

betterworld
 2010-03-04 11:53
#134042 #134042
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
2010-03-04T02:08:00 murphy
dass ich zu sehr von meinen Erfahrungen mit Binärprogrammen beeinflusst war, wo man im Äquivalent zu $0 genau den zum Aufruf verwendeten Namen des Programmes vorfindet.

Das, was bei Binärprogrammen argv[0] ist, gibt es in der Form gar nicht bei Scripts, die über Shebang ausgeführt werden. Denn dabei wird der Aufruf des Scriptes in den Aufruf des Interpreters umgewandelt. Der Interpreter muss auch einen vollständigen Namen des Scriptes bekommen, weil er es sonst gar nicht öffnen könnte.

Ein kleines Experiment:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ cat interp.c 
#include <stdio.h>
#include <stdlib.h>


int
main (int argc, char *argv[])
{
for (int i=0; i<argc; i++) {
printf("%d: \"%s\"\n", i, argv[i]);
}
return 0;
}


$ cat script
#!/tmp/interp -blah


$ ./script eins zwei
0: "/tmp/interp"
1: "-blah"
2: "./script"
3: "eins"
4: "zwei"


$ ( exec -a null ./script eins zwei )
0: "/tmp/interp"
1: "-blah"
2: "/tmp/script"
3: "eins"
4: "zwei"


Das argv[0] (naemlich "null") ist hier nirgends wiederzufinden. Ein bisschen wundert mich nur der Unterschied zwischen Zeile 23 und 31.

Ferner gibt es auch Unixsysteme, die statt /tmp/script ein Argument wie /dev/fd/0 übergeben, um Race-Conditions bei Setuid-Programmen zu vermeiden. Es wäre interessant zu sehen, was $0 da beinhaltet.

View full thread wer hat lust auf ein Spiel?