forked from blinry/nutsh-vorkurs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path22-shell-scripts.nutsh
83 lines (66 loc) · 4.49 KB
/
22-shell-scripts.nutsh
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
lesson_name("Shell-Skripte")
make_home
run(`rm "$ROOT/schlafzimmer/how"`)
"Sie kennen bereits Aliase, die Ihnen Tipparbeit bei oft benutzten Befehlen abnehmen können."
"Was ist aber, wenn wir einige Zeilen immer wieder zusammen ausführen oder mit Pipes kombinieren, und diese zu einem Befehl zusammenfassen möchten? Wir schreiben uns ein Shell-Skript!"
"Legen Sie im Schlafzimmer eine neue Datei namens `how` an und schreiben Sie dort eine Zeile hinein, die \"hallo\" ausgibt. Sie können das Skript dann per `bash [Skriptname]` starten."
prompt {
if command =~ `b?a?sh\s+.*how` {
if file("$ROOT/schlafzimmer/how") {
if run(`sh "$ROOT"/schlafzimmer/how`) =~ "hallo$" {
expect(`echo "echo hallo" > schlafzimmer/how; bash how`)
break
} else {
"Das Skript gibt noch nicht das Richtige aus."
}
} else {
expect("bash how")
"Das Skript `how` im Schlafzimmer existiert noch nicht."
}
}
}
"So, nun wäre es schön, wenn man nicht mehr davorschreiben müsste, dass wir das Skript mit der `bash`-Shell starten wollen. Sie können dazu in die erste Zeile der Datei folgendes schreiben: \"#!/bin/bash -i\" - Raute und Ausrufezeichen sind der sogenannte *Shebang*, dann folgt der absolute Pfad zu dem Programm, mit dem das Skript ausgeführt werden soll. Die Option `-i` startet die Bash im *interaktiven Modus*, das ist notwendig, damit wir nachher im Skript auf die Befehls-History zugreifen können."
"Zweitens müssen Sie das Skript mit `chmod u+x [Datei]` *ausführbar* machen. (Lesen Sie die Manpage und lassen Sie sich die Rechte mit `ls -l` anzeigen, wenn's Sie interessiert!)"
"Dann können Sie das Skript starten, indem Sie `./[Datei]` schreiben. Der Punkt steht dabei ja für den aktuellen Ordner - ansonsten weiß die Shell nicht, wo sie den Befehl suchen soll."
prompt {
if command =~ `\./how` && output =~ "hallo$" {
expect(`cd schlafzimmer; echo -e '#!/bin/bash -i\necho hallo' > how; chmod u+x how; ./how`)
break
}
}
"Naja, wir können der Shell auch beibringen, wo sie nach Skripts suchen soll! Es gibt die Variable `PATH`, die eine Liste von Verzeichnissen enthält, in denen nach Skripts gesucht wird. Die Verzeichnisse sind mit Doppelpunkten getrennt. Am einfachsten fügen Sie den aktuellen Ordner so hinzu: `PATH=$PATH:$(pwd)` - die Variable wird dabei um einen Doppelpunkt und die Ausgabe von `pwd` ergänzt. Lassen Sie sich vorher und hinterher die Variable ruhig nochmal ausgeben."
"Danach gehen Sie in ein anderes Zimmer und versuchen Sie, Ihr Skript einfach per `how` zu starten!"
prompt {
if command =~ "how$" && output =~ "hallo$" {
expect("PATH=$PATH:$(pwd); cd ../wohnzimmer; how")
break
}
}
run("export PATH")
"So, und nun machen wir was Sinnvolles mit dem Skript: Ändern Sie es so, dass es die Befehlshistory nach einem Muster durchsucht (das man dem Skript als Argument übergeben kann) und die Treffer alphabetisch sortiert ausgibt. Sie können `$1` benutzen, um sich auf das erste Argument des Skripts zu beziehen."
prompt {
if command =~ "how\s+\S+" && (run(`cat "$ROOT"/schlafzimmer/how`) =~ `history\s*\|\s*grep\s+.*\$1.*\|\s*sort\s+.*-k\s*2` || run(`cat "$ROOT"/schlafzimmer/how`) =~ `history\s*\|\s*sort\s+.*-k\s*2.*\|\s*grep\s+.*\$1\s*`) {
expect(`cd ../schlafzimmer; echo -e '#!/bin/bash -i\nhistory|grep "$1"|sort -k2' > how; how ls`)
expect(`cd ../schlafzimmer; echo -e '#!/bin/bash -i\n history | grep $1 | sort -k2' > how; how ls`)
expect(`cd ../schlafzimmer; echo -e '#!/bin/bash -i\n history | sort -k2 | grep $1' > how; how ls`)
"Das sieht gut aus! Super!"
break
} else {
expect(" ")
}
if ready {
break
}
if help {
expect("echo help")
"Am besten bearbeiten Sie diese Aufgabe schrittweise: Lassen Sie sich in dem Skript zunächst die gesamte Befehlshistory ausgeben. Dann filtern Sie diese Ausgabe mit `grep` nach einem festen Wort (zum Beispiel \"ratte\"). Dann filtern Sie nach dem ersten Argument des Skripts (\"$1\") und schließlich sortieren Sie mit `sort` nach der zweiten Spalte. Rufen Sie dann das Skript mit einem Argument auf (`how elefant`)."
}
}
"Viele Leute legen sich einen Ordner namens `bin` im eigenen Homeverzeichnis an, fügen diesen in der `.bashrc` der PATH-Variable hinzu und sammeln dort ihre Skripts."
"Mit `echo fertig` schließen Sie die Lektion ab."
prompt {
if ready {
expect("echo fertig")
break
}
}