File: config.xml

package info (click to toggle)
doc-linux-nl 20051127-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 16,408 kB
  • ctags: 94
  • sloc: xml: 47,403; makefile: 312; perl: 193; sh: 116; ansic: 12; csh: 9
file content (1452 lines) | stat: -rw-r--r-- 56,088 bytes parent folder | download | duplicates (2)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
<chapter id="configuration-chapter"><title>I Gotta Be Me!</title>

<blockquote><literallayout>
  If God had known we'd need foresight, she would have given it to us.
</literallayout></blockquote>

<sect1 id="config-bash"><title><application>Bash</application> aanpassen</title>
<para>
E&eacute;n van de dingen waarin de Unix filosofie zich onderscheidt, is dat de
systeemontwerpers geen poging ondernamen elke behoefte die gebruikers
zouden kunnen hebben voor te schrijven. In plaats daarvan probeerden ze 
het voor iedere individuele gebruiker makkelijk te maken om de omgeving 
aan hun eigen specifieke behoeften aan te passen. Dit wordt hoofdzakelijk 
bewerkstelligd via <emphasis>configuratiebestanden</emphasis><indexterm><primary>configuratiebestanden</primary></indexterm>. 
Deze staan ook bekend als "init files"<indexterm><primary>init files</primary></indexterm>,
"rc files"<indexterm><primary>rc files</primary></indexterm> (voor "run control"), of zelfs "dot
files", omdat de bestanden vaak met een punt "<filename>.</filename>" beginnen. 
Ter herinnering, bestandsnamen die met een "<filename>.</filename>" beginnen, worden
normaal gesproken niet door een <command>ls</command> weergegeven.
</para>

<para>
De belangrijkste configuratiebestanden zijn die door de shell worden
gebruikt. Linux's standaardshell is <application>bash</application>
en dat is
de shell die in dit hoofdstuk wordt behandeld. Voor we 
<application>bash</application> aan 
zullen gaan passen, moeten we weten naar welke bestanden 
<application>bash</application> zoekt.
</para>

<sect2 id="config-shellstart"><title>Shell opstart</title>
<para>
<application>Bash</application> kan op diverse manieren worden uitgevoerd.
Het kan als een <emphasis>loginshell</emphasis><indexterm><primary>login shell</primary></indexterm> worden
uitgevoerd, zo wordt het uitgevoerd wanneer je voor de eerste maal inlogt.
De loginshell is de eerste shell waar je mee te maken krijgt.
</para>

<para>
Een andere manier waarop <application>bash</application> kan worden uitgevoerd is als een
<emphasis>interactieve shell</emphasis><indexterm><primary>interactieve shell</primary></indexterm>. Dit is elke shell 
die een prompt presenteert aan een mens en wacht op invoer. Ook een 
loginshell is een interactieve shell. Een wijze waarop je een 
interactieve niet-login shell kunt krijgen is bijvoorbeeld met een 
shell binnen <application>xterm</application>
Elke shell die op enige andere wijze werd aangemaakt behalve voor het 
inloggen is geen login-shell.
</para>

<para>
Ten slotte zijn er nog <emphasis>niet interactieve shells</emphasis>
<indexterm><primary>niet-interactieve shells</primary></indexterm>
Deze shells worden gebruikt voor het uitvoeren van een bestand met
opdrachten, net als in MS-DOS<indexterm><primary>MS-DOS</primary>
</indexterm> batch files; de bestanden
die eindigen op <filename>.BAT</filename>. Deze <emphasis>shellscripts</emphasis><indexterm><primary>shellscripts</primary></indexterm> 
functioneren als mini-programma's. Terwijl ze gewoonlijk veel langzamer zijn
dan gecompileerde programma's is het vaak wel zo dat ze makkelijker zijn
te schrijven.
</para>

<para>
Afhankelijk van het type shell, zullen bij het opstarten van de shell
verschillende bestanden worden gebruikt:
</para>

<para>
<informaltable frame="all">
<tgroup cols="2"  align="left" colsep="1" rowsep="1">
<thead>
<row>
  <entry>Type Shell</entry>
  <entry>Actie</entry>
</row>
</thead>
<tbody>
<row>
  <entry>Interactieve login</entry>
  <entry>Het bestand <filename>.bash_profile</filename> wordt ingelezen en
uitgevoerd</entry>
</row>
<row>
<entry>Interactief</entry>
<entry>De bestanden <filename>.bashrc</filename> en <filename>.bashrc</filename>
worden ingelezen en uitgevoerd</entry>
</row>
<row>
<entry>Niet-interactief</entry>  
<entry>Het shellscript wordt ingelezen en uitgevoerd</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>

<sect2 id="config-startup"><title>Opstartbestanden</title>
<para>
Gezien de meeste gebruikers dezelfde omgeving willen, ongeacht voor 
welk type interactieve shell ze kiezen, of het een loginshell is of niet, 
zullen we onze configuratie starten met een zeer simpele opdracht in 
het bestand <filename>.bash_profile</filename>: 
"<command>source ~/.bashrc</command>". 
De <command>source</command><indexterm><primary>source</primary></indexterm>
opdracht vertelt de shell het argument 
als een shellscript te interpreteren. Wat dit voor ons betekent is dat 
elke keer wanneer <filename>.bash_profile</filename> wordt uitgevoerd, 
<emphasis>ook</emphasis> <filename>.bashrc</filename> wordt uitgevoerd.
</para>

<para>
We zullen nu gewoon wat opdrachten toe gaan voegen aan het bestand 
<filename>.bashrc</filename>. Wil je ooit dat je opdracht wordt uitgevoerd, wanneer je
inlogt, dan voeg je deze opdracht toe aan <filename>.bash_profile</filename>.
</para>
</sect2>

<sect2 id="aliasing-section"><title>Aliassen</title>
<para>
Wat is hetgeen je zou willen aanpassen?
Ik denk dat ongeveer 90% van de Bash gebruikers het volgende in 
<filename>.bashrc</filename> heeft geplaatst:
</para>

<para>
<screen>
alias ll="ls -l"
</screen>
</para>

<para>
Die opdracht definieerde een shell <emphasis>alias</emphasis>
<indexterm><primary>shell</primary><secondary>alias</secondary></indexterm>
genaamd <literal>ll</literal> welke "extraheert" tot de gewone shellopdracht 
"<command>ls -l</command>"
wanneer het wordt aangeroepen door de gebruiker.  Dus in de veronderstelling
dat Bash die opdracht uit <filename>.bashrc</filename> heeft gelezen, kun je 
gewoon <literal>ll</literal> typen om het effect van
"<command>ls -l</command>." te krijgen met slechts de helft van het aantal toetsaanslagen.
Wanneer je <literal>ll</literal> typt en de <keycap>Return</keycap>-toets 
indrukt, onderschept Bash het, omdat het uitkijkt naar aliassen, Bash vervangt 
het door "<command>ls -l</command>", en retourneert dat ervoor in de plaats. 
Op het systeem komt geen <literal>ll</literal> opdracht voor, maar de shell 
vertaalt de alias automatisch naar een geldig programma.

Een aantal aliassen staan in <xref linkend="sample-aliases"/>. 
Je zou ze in je eigen <filename>.bashrc</filename> kunnen plaatsen. Een 
vooral interessante alias is de eerste. Met die alias, wordt automatisch 
een <option>-F</option> vlag aangezet, wanneer iemand <command>ls</command> 
intikt. (De alias probeert zichzelf niet nogmaals
te extraheren.) Dit is een gebruikelijke manier
om opties toe te voegen die je elke keer gebruikt als je een programma
aanroept.

Let op het commentaar voorafgegaan door het <literal>#</literal> teken in
<xref linkend="sample-aliases"/>. Wanneer een <literal>#</literal>
verschijnt, negeert de shell de rest van de regel.
<indexterm><primary>shell</primary><secondary>commentaar</secondary></indexterm>
</para>

<para>
<example id="sample-aliases">
<title>Een aantal voorbeeldaliassen voor <application>bash</application></title>
<screen>
alias ls="ls -F"          # geef tekens aan het einde van de listing
alias ll="ls -l"          # speciale ls
alias la="ls -a"
alias ro="rm *~; rm .*~"  # backupbestanden aangemaakt door 
                          # Emacs verwijderen
alias rd="rmdir"          # bespaart tikken!
alias md="mkdir"
alias pu=pushd            # pushd, popd, en dirs werden niet behandeld 
alias po=popd             # in deze handleiding---je zou ze op 
alias ds=dirs             # kunnen zoeken in de manpage van bash 
# dit zijn allen slechts toetsenbordsnelkoppelingen
alias to="telnet cs.oberlin.edu"
alias ta="telnet altair.mcs.anl.gov"
alias tg="telnet wombat.gnu.ai.mit.edu"
alias tko="tpalk kold@cs.oberlin.edu"
alias tjo="talk jimb@cs.oberlin.edu"
alias mroe="more"         # spellingscorrectie!
alias moer="more"
alias email="emacs -f rmail" # mijn mail reader
alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""
                          # een manier om emacs aan te roepen
</screen>
</example>
</para>

<para>
Je hebt wellicht wat vreemds ontdekt. Ten eerste liet ik in een paar
aliassen de aanhalingstekens achterwege, zoals in <literal>pu</literal>.
Strict genomen, zijn aanhalingstekens niet echt nodig wanneer aan de
rechterkant van het is gelijk teken slechts &eacute;&eacute;n woord staat.
</para>

<para>
Het kan echter geen kwaad wel aanhalingstekens te gebruiken, dus
laat me je geen slechte gewoonten aanleren. Je moet ze in ieder geval
gebruiken als je een alias maakt voor een opdracht met opties en/of 
argumenten:
</para>

<para>
<screen>
alias rf="refrobnicate -verbose -prolix -wordy -o foo.out"
</screen>
</para>

<para>
In de laatste alias tenslotte is het gebruik van aanhalingstekens
wat eigenaardig:
</para>

<para>
<screen>
alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""
</screen>
</para>

<para>
Zoals je wellicht al raadde, wilde ik dubbele aanhalingstekens in de opties
zelf doorgeven, dus moest ik die laten voorafgaan door een backslash
om te voorkomen dat <application>bash</application> zou denken dat 
het 't einde van de alias was.
</para>

<para>
Als laatste heb ik twee gebruikelijke typfouten, nl "more" en 
"moer" in een alias geplaatst voor de opdracht die ik daarmee bedoel,
<command>more</command>. Argumenten die je aan een programma doorgeeft, 
verstoren aliassen niet. Het volgende werkt prima:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> mroe hurd.txt
</screen>
</para>

<para>
In feite beslaat, weten hoe je je eigen aliassen maakt, waarschijnlijk
minstens de helft van alle aanpassingen aan de shell. Experimenteer
er wat mee, zoek uit welke lange opdrachten je veel typt, en maak
hier aliassen voor aan. Je zult bemerken dat het 't werken achter de
shellprompt veel plezieriger maakt.
</para>
</sect2>

<sect2 id="section-env-variables"><title>Omgevingsvariabelen</title>
<para>
Iets anders van belang wat wordt ingesteld in <filename>.bashrc</filename> zijn
<emphasis>omgevingsvariabelen</emphasis><indexterm><primary>omgevingsvariabelen</primary></indexterm>.
En wat zijn omgevingsvariabelen?
Laten we het eens van een andere kant bekijken:
stel dat je de documentatie van het programma <command>fruggle</command>
aan het lezen bent en dat je deze zinnen tegenkomt:
</para>

<para>
Fruggle zoekt normaal gesproken in de homedirectory van de gebruiker
naar het configuratiebestand <filename>.frugglerc</filename>.
Als echter de omgevingsvariabele <varname>FRUGGLEPATH</varname> op een 
andere bestandsnaam is ingesteld, zal het in plaats daarvan daar zoeken.
</para>

<para>
Elk programma wordt uitgevoerd in een <emphasis>omgeving</emphasis><indexterm><primary>omgeving</primary></indexterm>, en die
omgeving wordt gedefinieerd door de shell die het programma aanriep
<footnote><para>Nu zie je waarom shellprogramma's zo belangrijk zijn.
Stel dat je met de hand een gehele omgeving moest doorgeven elke keer
dat je een programma aanriep!</para></footnote>. Van de omgeving kan worden 
gesteld dat ze zich "binnen" de shell bevindt.
Programmeurs gebruiken een speciale routine om de omgeving te
ondervragen en het <command>fruggle</command> programma maakt gebruik van deze routine.
Het controleert de waarde van de omgevingsvariabele 
<envar>FRUGGLEPATH</envar>.  Als
blijkt dat die variabele ongedefinieerd is, dan zal het gewoon het bestand
<filename>.frugglerc</filename> in je homedirectory gebruiken. Als het echter gedefinieerd 
is, zal <command>fruggle</command> de waarde van die variabele gebruiken (wat de naam
van een bestand moet zijn welke <command>fruggle</command> kan gebruiken in plaats
van het standaardbestand <filename>.frugglerc</filename>).
</para>

<para>
Zo kun je de omgeving onder <application>bash</application> wijzigen:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> export PGPPATH=/home/larry/secrets/pgp
</screen>
</para>

<para>
De opdracht <command>export</command> kun je zien met als betekenis "Exporteer
deze variabele naar de omgeving van waaruit ik programma's zal aanroepen,
zodat de waarde ervan zichtbaar is voor die programma's." 
De naam <command>export</command> is niet zonder reden, zoals je later zult zien.
</para>

<para>
Deze bepaalde variabele wordt gebruikt door 
Phil Zimmerman<indexterm><primary>Zimmerman, Paul</primary></indexterm>'s public-key encryptie programma, 
<application>pgp</application><indexterm><primary>pgp</primary></indexterm>.
Standaard maakt <application>pgp</application> gebruik van je homedirectory
als lokatie om naar bepaalde bestanden te zoeken die het nodig heeft
(met encryptiesleutels) en tevens een plaats voor het opslaan van tijdelijke
bestanden die het tijdens de uitvoering aanmaakt. Door de variabele
<varname>PGPPATH</varname> op deze waarde in te stellen, vertelde ik het 
in plaats daarvan de directory <filename>/home/larry/secrets/pgp</filename> 
te gebruiken. Ik moest de <application>pgp</application> handleiding lezen om achter de exacte naam van
de variabele te komen en wat deze doet, maar het is tamelijk standaard
de naam van het programma in hoofdletters te gebruiken, voorafgegaan door
het voorvoegsel "PATH".
</para>

<para>
Het is ook handig om de omgeving te kunnen ondervragen:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> echo $PGPPATH
/home/larry/.pgp
<prompt>/home/larry#</prompt>
</screen>
</para>

<para>
Let op het teken "$"; je laat een omgevingsvariabele voorafgaan door
een dollar-teken om aan de waarde van de variabele te komen. Had je het
getypt zonder dit dollar-teken, dan zou <command>echo</command> simpelweg 
het opgegeven argument op het scherm hebben weerkaatst:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> echo PGPPATH
PGPPATH
<prompt>/home/larry#</prompt>
</screen>
</para>

<para>
De "$" wordt gebruikt om omgevingsvariabelen te 
<emphasis>evalueren</emphasis>, maar het doet dit alleen in de context 
van de shell; dat wil zeggen wanneer de shell interpreteert. Wanneer 
interpreteert de shell? Wanneer je opdrachten achter de prompt intikt 
of wanneer <application>bash</application> opdrachten inleest vanuit
een bestand zoals <filename>.bashrc</filename>, kan worden gesteld 
dat het de opdrachten "interpreteert".
</para>

<para>
Er is nog een andere handige opdracht voor het ondervragen van de
omgeving: <command>env</command>.<indexterm><primary>env</primary></indexterm>
<command>env</command> zal louter een opsomming
geven van de omgevingsvariabelen. Het is mogelijk dat de lijst van het
scherm afscrollt, vooral als je van X gebruik maakt. Als dit gebeurt,
sluis de uitvoer van <command>env</command> dan door naar 
<command>more</command>: <command>env|more</command>.
</para>

<para>
Een paar van deze variabelen kunnen nogal nuttig zijn, dus we zullen
ze behandelen. Kijk naar onderstaande tabel <xref linkend="env-variables"/>. 
Deze vier variabelen worden automatisch gedefinieerd wanneer je inlogt: 
je stelt ze niet in via <filename>.bashrc</filename> of 
<filename>.bash_login</filename>.
</para>

<para>
<anchor id="env-variables"/>
<table frame="all"><title>Een aantal belangrijke omgevingsvariabelen</title>
<tgroup cols="3" align="left" colsep="1" rowsep="1">
<thead>
<row>
  <entry>Variabelenaam</entry>
  <entry>Inhoud</entry>
  <entry>Voorbeeld</entry>
</row>
</thead>
<tbody>
<row>
  <entry><envar>HOME</envar></entry>
  <entry>homedirectory</entry>
  <entry>/home/larry</entry>   
</row>
<row>
  <entry><envar>TERM</envar></entry>
  <entry>type terminal</entry>
  <entry>xterm, vt100 of console</entry>
</row>
<row>
  <entry><envar>SHELL</envar></entry>   
  <entry>Pad naar je shell</entry>
  <entry>/bin/bash</entry>   
</row>
<row>
  <entry><envar>USER</envar></entry>
  <entry>Je loginnaam</entry>
  <entry>larry</entry>
</row>
<row>
  <entry><envar>PATH</envar></entry>
  <entry>Te doorzoeken lijst naar programma's</entry>
  <entry>/bin:/usr/bin:/usr/local/bin:/usr/bin/X11</entry>
</row>
</tbody>
</tgroup>
</table>
</para>

<para>
Laten we de variabele <envar>TERM</envar> eens nader bekijken. <indexterm><primary>terminals</primary></indexterm>
Om deze variabele te kunnen begrijpen, moeten we bekend zijn met de
historie van &unix;. Het besturingssysteem moet bepaalde feiten kennen
over je console, om basisfuncties zoals het schrijven van een teken
naar het scherm uit te voeren, de cursor naar de volgende regel te
verplaatsen, enz. In de begindagen van computers, voegden fabrikanten
constant nieuwe features toe aan hun terminals: eerst reverse-video, toen
wellicht Europeaanse tekensets, eventueel zelfs primitieve tekenfuncties
(denk er aan, dit was voordat er venstersystemen en muizen bestonden).
Echter al deze nieuwe functies bezorgden de programmeurs problemen:
hoe konden zij weten wat een terminal ondersteunde en wat niet? En hoe
konden ze nieuwe features ondersteunen zonder de oude terminals waardeloos
te maken?
</para>

<para>
Onder &unix;, was het antwoord op deze vragen 
<filename>/etc/termcap</filename>
<indexterm><primary>/etc/termcap</primary></indexterm>. <filename>/etc/termcap</filename> bestaat uit een
lijst met alle terminals die je systeem kent, en hoe ze de cursor besturen.
Als een systeembeheerder een nieuwe terminal aanschafte, hoefde hij slechts
de gegevens van die terminal aan <filename>/etc/termcap</filename> toe te voegen in plaats
dat hij &unix; geheel opnieuw moest samenstellen. Soms werkt het zelfs nog
eenvoudiger. Zo langzamerhand werd de vt100<indexterm><primary>vt100</primary></indexterm> terminal van
Digital Equipment Corporation<indexterm><primary>Digital Equipment Corporation</primary></indexterm> een
pseudo-standaard, en veel nieuwe terminals werden zo gebouwd dat ze
deze terminal konden emuleren of zodanig konden functioneren alsof het
een vt100 was.
</para>

<para>
Onder Linux, is de waarde van <envar>TERM</envar> soms <literal>console</literal>. 
Dit is een op vt100 lijkende terminal met een aantal extra features.
</para>

<para>
<indexterm><primary>shell</primary><secondary>zoekpad</secondary></indexterm>
Een andere variabele, <envar>PATH</envar>, is ook beslissend voor het 
juist functioneren van de shell. Hier is de mijne:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> env | grep ^PATH
PATH=/home/larry/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:
/usr/TeX/bin 
<prompt>/home/larry#</prompt>
</screen>
</para>

<para>
Je <envar>PATH</envar> bestaat uit een door dubbele punten gescheiden lijst met
die directory's die de shell doorzoekt op programma's, wanneer je de naam
van een uit te voeren programma intikt. Wanneer ik bijvoorbeeld <command>ls</command>
intik en op de <keycap>Return</keycap>-toets druk, dan zoekt Bash als eerste in
<filename>/home/larry/bin</filename>, een directory aangemaakt voor het opslaan 
van programma's die ik schreef. Ik schreef echter geen <command>ls</command>
(in feite denk ik dat het is geschreven nog voor ik werd geboren!).
Het niet kunnen vinden in <filename>/home/larry/bin</filename>, maakt dat Bash
vervolgens zoekt in <filename>/bin</filename>, en daar lukt het wel!
<command>/bin/ls</command> komt voor en het is uitvoerbaar, dus Bash stopt met
zoeken naar een programma met de naam <command>ls</command> en voert het uit.
Er had net zo goed nog een ander programma met de naam <command>ls</command>
in de directory <filename>/usr/bin</filename> voor kunnen komen, maar <application>bash</application> zou
het nooit uitvoeren tenzij hier expliciet om wordt gevraagd door een
absolute padnaam op te geven:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> /usr/bin/ls
</screen>
</para>

<para>
De variabele <envar>PATH</envar> is ervoor dat we geen volledige padnamen 
voor elke opdracht in hoeven tikken. Wanneer je een opdracht intikt, zoekt 
Bash naar deze opdracht in de volgorde opgegeven in <envar>PATH</envar>, en
voert deze uit als het de opdracht aantreft. Vind het de opdracht niet, 
dan krijg je een primitieve foutmelding:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> clubly
clubly: command not found
</screen>
</para>

<para>
In mijn <envar>PATH</envar> komt de directory "<filename>.</filename>" niet 
voor. Als dit wel zo was zou het er ongeveer zo hebben uitgezien:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt> echo $PATH
.:/home/larry/bin:/bin:/usr/bin:/usr/local/bin:
/usr/bin/X11:/usr/TeX/bin
<prompt>/home/larry#</prompt>
</screen>
</para>

<para>
Dit heeft te maken met een of ander debat in Unix kringen (waar je nu
deel van uitmaakt, of je dat nu leuk vindt of niet). Het probeem bestaat
hieruit dat het plaatsen van de huidige directory in je PATH een 
beveiligingslek kan veroorzaken. Stel dat je met <command>cd</command>
naar een directory gaat waar iemand een "Trojan Horse" programma met de 
naam <command>ls</command> heeft achtergelaten, en je geeft de opdracht 
<command>ls</command> wat je al snel doet
als je eenmaal in een andere directory bent aangekomen. Gezien de 
huidige directory "<filename>.</filename>" als eerste in je <envar>PATH</envar> voorkomt, 
zou de shell deze versie van <command>ls</command> aantreffen en het uitvoeren.
Wat voor onheil wellicht in dat programma is geplaatst, heb je dan uitgevoerd.
De persoon die dit deed had hier geen rootprivileges voor nodig; er was
alleen schrijfpermissies nodig op de directory waar de "onechte" <command>ls</command>
werd gelokaliseerd. Het zou zijn homedirectory kunnen zijn geweest, 
als iemand zou weten dat je daar ooit rond zou neuzen.
</para>

<para>
Op je eigen systeem is het hoogstonwaarschijnlijk dat mensen een val voor
elkaar zetten.  Alle gebruikers zijn waarschijnlijk
vrienden of collega's. Op een groot multi-user systeem 
(zoals op vele universiteitscomputers), zouden er echter voldoende
onvriendelijke programmeurs kunnen zijn die je nog nooit hebt ontmoet.
Of je nu wel of niet het risico wilt lopen "<filename>.</filename>" in je
pad op te nemen, is afhankelijk van je situatie; Ik was niet van plan
om er op wat voor wijze dan ook autoritair in te zijn, ik wil gewoon
dat je bewust bent van de risico's<footnote><para>Denk eraan dat je altijd
programma's in de huidige directory uit kunt voeren door expliciet het
pad op te geven, d.w.z.: "<filename>./foo</filename>".</para></footnote>  
Multi-user systemen zijn in werkelijkheid gemeenschappen, waar mensen
elkaar op allerlei onvoorziene manieren iets aan kunnen doen.
</para>

<para>
De werkelijke wijze waarop ik mijn <envar>PATH</envar> instel, bestaat 
voornamelijk uit wat je tot dusverre hebt geleeerd over omgevingsvariabelen. 
Zo ziet mijn <filename>.bashrc</filename> eruit:
</para>

<para>
<screen>
export PATH=${PATH}:.:${HOME}/bin:/bin:/usr/bin:/usr/local/bin:
/usr/bin/X11:/usr/TeX/bin
</screen>
</para>

<para>
Hier maak ik gebruik van het feit dat de variabele <envar>HOME</envar> is
ingesteld voordat Bash mijn <filename>.bashrc</filename> inleest, door de waarde
ervan te gebruiken bij het instellen van mijn <envar>PATH</envar>.
De accolades ("{...}") dienen als een extra niveau
van quoting; ze bakenen in zekere mate af waartoe "$" zal evalueren,
zodat de shell niet in verwarring raakt door de tekst die er onmiddellijk 
opvolgt, (in dit geval "<filename>/bin</filename>"). Hier is nog een voorbeeld van
het effect van accolades:
</para>

<para>
<screen>
<prompt>/home/larry#</prompt><userinput> echo ${HOME}foo</userinput>
<computeroutput>/home/larryfoo</computeroutput>
<prompt>/home/larry#</prompt>
</screen>
</para>

<para>
Zonder de accolades zou ik niets krijgen, aangezien er geen 
omgevingsvariabele met de naam <envar>HOMEfoo</envar> bestaat.
</para>

<para>
<screen>
<prompt>/home/larry#</prompt><userinput>echo $HOMEfoo</userinput>

<prompt>/home/larry#</prompt>
</screen>
</para>

<para>
Laat me iets anders in dat pad verduidelijken: de betekenis van 
"${PATH}".  Het neemt de waarde van een <envar>PATH</envar> variabele op
in mijn nieuwe <envar>PATH</envar> die <emphasis>eerder</emphasis> werd ingesteld. Waar werd de
oude variabele ingesteld?  Het bestand <filename>/etc/profile</filename> dient als een soort
globaal <filename>.bash_profile</filename> dat voor alle gebruikers gelijk is.
Een dergelijk gecentraliseerd bestand maakt het makkelijker voor de
systeembeheerder om een nieuwe directory toe te voegen aan ieders
<envar>PATH</envar> of iets dergelijks, zonder ze allemaal individueel te hoeven
wijzigen. Als je het oude directorypad in je nieuwe directorypad opneemt,
dan raak je geen directory's kwijt die het systeem reeds voor je heeft
ingesteld.
</para>

<para>
Je kunt ook zelf bepalen hoe je prompt eruit komt te zien. 
Dit wordt bewerkstelligd
door het instellen van de waarde van de omgevingsvariabele <envar>PS1</envar>.  
Persoonlijk wil ik een prompt die me het directorypad van de huidige 
werkdirectory toont. Ik bewerkstellig dit als volgt in mijn <filename>.bashrc</filename>:
</para>

<para>
<screen>
export PS1='$PWD# '
</screen>
</para>
<para>
<indexterm><primary>shell</primary><secondary>quoting</secondary></indexterm>
Zoals je kunt zien, worden er hier in feite <emphasis>twee</emphasis> variabelen gebruikt.
Degene die wordt ingesteld is <envar>PS1</envar>, en het wordt ingesteld 
op de waarde van <envar>PWD</envar>, waaraan kan worden gedacht als de
"Print Werk Directory" of "DirectoryPad van WerkDirectory".  
Maar de evaluatie van <envar>PWD</envar> vindt plaats binnen enkele aanhalingstekens. 
De enkele aanhalingstekens dienen om de expressie daartussenin te evalueren,
welke zelf de variabele <envar>PWD</envar> evalueert. Als je de opdracht
<command>export PS1=$PWD</command> gaf, dan zou je in je prompt constant het pad
naar de huidige directory worden weergegeven <emphasis>op moment dat</emphasis>
<envar>PS1</envar> <emphasis>werd ingesteld</emphasis>, in plaats van dat 
het werd bijgewerkt zodra je van directory wijzigt. Dat schept wat verwarring, 
en echt belangrijk is het niet. Onthoud gewoon dat je de aanhalingstekens nodig 
hebt als je wilt dat de huidige directory wordt weergegeven in je prompt.
</para>

<para>
Misschien geef je de voorkeur aan <command>export PS1='$PWD>'</command>, of 
zelfs de systeemnaam: <command>export PS1=`hostname`'>'</command>. 
Laat me dat laatste voorbeeld wat verder uitdiepen.
</para>

<para>
In het laatste voorbeeld werd gebruik gemaakt van een <emphasis>nieuw</emphasis> type
quoting, de back quotes. Deze aanhalingstekens bieden nergens bescherming 
tegen. Je zult bemerken dat "hostname" nergens in de prompt verschijnt 
wanneer je dat uitvoert. Wat er in werkelijkheid gebeurt is dat de 
opdracht tussen de aanhalingstekens wordt ge&euml;valueerd, en de 
uitvoer in plaats van de aanhalingstekens en de opdrachtnaam wordt geplaatst.
</para>

<para>
Probeer <command>echo `ls`</command> of <command>wc `ls`</command>.
Als je wat meer ervaren bent in het gebruik van de shell, dan zal deze 
techniek steeds krachtiger worden.
</para>

<para>
Er valt heel wat meer te configureren aan <filename>.bashrc</filename>, 
maar daarvoor is hierin niet voldoende ruimte om het allemaal uit te leggen.
Voor meer informatie kun je de manpage van <application>bash</application> 
lezen of vragen stellen aan ervaren gebruikers van Bash. Hier is een 
volledig <filename>.bashrc</filename> bestand voor je om te bestuderen;
het is vrij standaard, alhoewel het zoekpad wat lang is.
</para>

<para>
<screen>
# wat willekeurige opdrachten:
ulimit -c unlimited
export history_control=ignoredups
export PS1='$PWD>'
umask 022

# toepassingsspecifieke paden:
export MANPATH=/usr/local/man:/usr/man
export INFOPATH=/usr/local/info
export PGPPATH=${HOME}/.pgp

# maak het PATH aan:
homepath=${HOME}:~/bin
stdpath=/bin:/usr/bin:/usr/local/bin:/usr/ucb/:/etc:/usr/etc:/usr/games
pubpath=/usr/public/bin:/usr/gnusoft/bin:/usr/local/contribs/bin
softpath=/usr/bin/X11:/usr/local/bin/X11:/usr/TeX/bin
export PATH=.:${homepath}:${stdpath}:${pubpath}:${softpath}
# Technisch gesproken, waren de accolades niet nodig, omdat de dubbele
# punten geldige scheidingstekens zijn; niettemin is het een goede 
# gewoonte gebruik te maken van accolades, en ze kunnen geen kwaad.

# aliassen
alias ls="ls -CF"
alias fg1="fg %1"
alias fg2="fg %2"
alias tba="talk sussman@tern.mcs.anl.gov"
alias tko="talk kold@cs.oberlin.edu"
alias tji="talk jimb@totoro.bio.indiana.edu"
alias mroe="more"
alias moer="more"
alias email="emacs -f vm"
alias pu=pushd
alias po=popd
alias b="~/.b"
alias ds=dirs
alias ro="rm *~; rm .*~"
alias rd="rmdir"
alias ll="ls -l"
alias la="ls -a"
alias rr="rm -r"
alias md="mkdir"
alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""

function gco
{
  gcc -o $1 $1.c -g
}
</screen>
</para>
</sect2>
</sect1>

<sect1 id="config-init-X"><title>De init-files van het X Window Systeem</title>
<para>
<informalfigure fload="0">
<graphic fileref="png-files/grote-X.png"></graphic>
</informalfigure>
De meeste mensen prefereren hun werk in een grafische omgeving
te doen, en voor &unix;-machines, betekent dat gewoonlijk het gebruik van X.
Als je gewend bent aan de Macintosh<indexterm><primary>Macintosh</primary></indexterm> of Microsoft
Windows<indexterm><primary>Microsoft Windows</primary></indexterm>, dan duurt het even eer je aan het
X Window Systeem gewend bent, vooral in hoe het wordt aangepast.
</para>

<para>
Bij de Macintosh of Microsoft Windows kun je de omgeving <emphasis>vanuit</emphasis> de omgeving aanpassen: als je bijvoorbeeld de omgeving wilt wijzigen, dan 
doe je dit door op de nieuwe kleur te klikken in een of ander
speciaal grafisch setupprogramma. Onder X, worden de standaardsysteemwaarden
bestuurd door tekstbestanden, die je op directe wijze bewerkt, m.a.w.
je typt de daadwerkelijke kleurnaam in een bestand om je achtergrond op 
die kleur in te stellen.
</para>

<para>
Er valt niet te ontkennen dat deze methode niet zo handig is als een aantal
commerci&euml;le venstersystemen.  Ik denk dat deze neiging om zelfs in
een grafische omgeving tekstge&ouml;ori&euml;nteerd te blijven, te maken heeft
met het feit dat X werd gecre&euml;erd door een boel programmeurs die simpelweg
niet trachtten software te schrijven die hun grootouders konden gebruiken.
Deze neiging kan in toekomstige versies van X veranderen (tenminste ik hoop
dat dit zo is), maar thans zul je moeten leren omgaan met nog meer
tekstbestanden. Het geeft je in ieder geval op z'n minst een zeer flexibele
en precieze controle over je configuratie.
</para>

<para>

Hier zijn de belangrijkste bestanden voor het configureren van X:

<informaltable frame="all">
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<tbody>
<row>
  <entry>.xinitrc</entry>
  <entry>Een script dat door X wordt uitgevoerd wanneer het opstart</entry>
</row>
<row>
  <entry>.twmrc</entry>
  <entry>Wordt ingelezen door de X-Windowmanager <command>twm</command></entry>
</row>
<row>
  <entry>.fvwmrc</entry>
  <entry>Wordt ingelezen door de X-Windowmanager <command>fvwm</command>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>

<para>        
Deze bestanden zouden als ze al bestaan allemaal in je homedirectory
te vinden moeten zijn.

<filename>.xinitrc</filename> is een simpel shellscript dat wordt uitgevoerd wanneer
X wordt aangeroepen.  Het kan alles wat een ander shellscript kan, maar
natuurlijk is het zinvoller het te gebruiken voor het opstarten van diverse
X-programma's en het instellen van parameters voor het venstersysteem.
De laatste opdracht in <filename>.xinitrc</filename> bestaat gewoonlijk uit de naam van 
een uit te voeren window manager, zoals bijvoorbeeld 
<filename>/usr/bin/X11/twm</filename>.
</para>

<para>
Wat zou je willen plaatsen in het bestand <filename>.xinitrc</filename>?
Misschien wat aanroepen naar het programma <application>xsetroot</application>
om je rootvenster (de achtergrond) en muiscursor in te stellen op de wijze
waarop je wilt dat ze eruit zien. Aanroepen naar
<application>xmodmap</application>, die de server vertelt<footnote><para>De "server" betekent 
gewoon het hoofdproces X op je machine, degene met wie alle andere X-programma's
moeten communiceren om gebruik te kunnen maken van het display. Deze andere
programma's staan bekend als "clients" en het geheel wordt een
"client-server" systeem genoemd.</para></footnote> hoe de signalen van 
je toetsenbord
te interpreteren. Eventuele andere programma's die je elke keer dat je
X uitvoert opgestart wilt hebben (zoals bijvoorbeeld 
<application>xclock</application>).
</para>

<para>
Hier is een deel van mijn <filename>.xinitrc</filename>; die van jou ziet er ongetwijfeld
anders uit, dus dit is slechts bedoeld als een voorbeeld:
</para>

<para>
<screen>
#!/bin/sh
# Met de eerste regel wordt aan het besturingssysteem opgegeven welke
# shell moet worden gebruikt om dit script te interpreteren. Het script
# zelf wordt verondersteld te zijn gemarkeerd als uitvoerbaar;
# je kunt dit instellen met de opdracht "chmod +x ~/.xinitrc". 

# xmodmap is een programma waarmee je de X-server duidelijk kunt maken
# hoe de signalen van je toetsenbord moeten worden ge&iuml;nterpreteerd.
# Het is *beslist* de moeite waard hier iets over te leren. Je hebt
# "man xmodmap", "xmodmap -help", "xmodmap -grammar", en meer.
# Ik kan je niet garanderen dat onderstaande expressies op jouw systeem
# iets zullen betekenen (ik kan zelfs niet garanderen dat ze op mijn
# systeem van betekenis zijn):
xmodmap -e 'clear Lock'
xmodmap -e 'keycode 176 = Control_R'
xmodmap -e 'add control = Control_R'
xmodmap -e 'clear Mod2'
xmodmap -e 'add Mod1 = Alt_L Alt_R'

# xset is een programma voor het instellen van een aantal andere 
# parameters van de X-server:
xset m 3 2 &       # parameters voor de muis
xset s 600 5 &     # voorkeuren van de screensaver 
xset s noblank &   # ditto
xset fp+ /home/larry/x/fonts # voor cxterm
# Geef de opdracht "xset -help" voor meer informatie.

# Vertel de X server fish.cursor bovenop fish.mask te plaatsen en het
# resulterende patroon te gebruiken als mijn muiscursor:
xsetroot -cursor /home/lab/larry/x/fish.cursor /home/lab/larry/x/fish.mask &

# Een plezierig achtergrondpatroon en kleur:
xsetroot -bitmap /home/lab/larry/x/pyramid.xbm -bg tan

# te doen: xrdb hier?  Hoe zit het met het bestand .Xdefaults?

# Geef de opdracht "man xsetroot", of "xsetroot -help" voor meer 
# informatie over bovenstaand gebruikt programma.

# Een clientprogramma, de indrukwekkende ronde kleurenklok van 
# Jim Blandy:
/usr/local/bin/circles &

# Misschien dat je ten alle tijden een klok op je scherm wilt?
/usr/bin/X11/xclock -digital &

# Laat client X-programma's uitvoeren op occs.cs.oberlin.edu om ze daar
# weer te geven, doe hetzelfde voor juju.mcs.anl.gov:
xhost occs.cs.oberlin.edu
xhost juju.mcs.anl.gov

# Je kunt de X-server simpelweg laten weten clients op anders hosts 
# uit te laten voeren (een host als remote machine) om het daar
# weer te geven, maar dit is een beveiligingslek; die clients zouden
# door iemand anders uitgevoerd kunnen worden, en je toetsaanslagen 
# kunnen onderscheppen als je iets dergelijks als je wachtwoord 
# invoert! Als je het echter toch wilt, dan zou je een "+" kunnen 
# gebruiken, wat staat voor alle mogelijke hostnamen, in plaats 
# van gebruik te maken van specifieke hostnamen, zoals:
# xhost +

# En start als laatste de window manager:
/usr/bin/X11/twm
# Sommige mensen geven de voorkeur aan een andere window manager. Ik 
# gebruik twm, maar fvwm wordt ook vaak met Linux gedistribueerd:
# /usr/bin/X11/fvwm
</screen>
</para>

<para>
Een aantal opdrachten wordt in de achtergrond uitgevoerd (d.w.z.:
er staat een "&amp;" achter de opdracht), terwijl weer andere niet.
Het onderscheid is hier dat een aantal programma's zullen worden opgestart 
wanneer je X start en blijven draaien totdat je X weer verlaat, deze programma's
worden in de achtergrond geplaatst. Andere programma worden slechts
eenmaal uitgevoerd. <application>xsetroot</application> is hier een voorbeeld van; het
stelt slechts het rootvenster of de cursor of iets dergelijks in en
sluit dan weer af.
</para>

<para>
Zodra de window manager is opgestart, zal het zijn eigen init
file inlezen, welke bestuurt hoe zaken zoals je menu's zijn ingesteld,
op welke posities vensters naar voren komen, de besturing over ikonen,
en andere belangrijke zaken. Maak je gebruik van 
<application>twm</application>, dan is dit
het bestand <filename>.twmrc</filename> in je homedirectory. 
Gebruik je <application>fvwm</application> dan is het <filename>.fvwmrc</filename>, enz. Ik heb alleen maar iets met deze twee
bestanden te maken, aangezien dat de window managers zijn die je naar
alle waarschijnlijkheid aantreft onder Linux.
</para>

<sect2 id="twm-config-section"><title>Twm configuratie</title>
<para>
<indexterm><primary>twm</primary></indexterm>
Het bestand <filename>.twmrc</filename> is geen shellscript. Het is in 
wezen geschreven in een taal die speciaal voor <application>twm</application>
is ontworpen, geloof
het of niet!<footnote><para>Dit is &eacute;&eacute;n van de hardvochtige 
feiten over init files: ze hebben gewoonlijk elk hun eigen karakteristieke 
opdrachttaal. Dit betekent dat gebruikers zeer snel erg goed worden in het 
leren van opdrachttalen. Ik veronderstel dat het aardig zou zijn geweest 
als eerdere Unix programmeurs een of ander standaardformaat voor init files 
overeen waren gekomen, zodat we niet elke keer weer een nieuwe syntax 
hoefden te leren, maar om eerlijk te zijn, is het moeilijk te voorspellen 
wat voor soort informatie programma's nodig zullen hebben.</para></footnote>
Het belangrijkste waarmee
mensen graag experimenteren in hun <filename>.twmrc</filename> is de stijl 
van de vensters (zoals kleuren en dergelijke) en het maken van gave menu's,
dus hier een voorbeeld van een <filename>.twmrc</filename> waarin dat is gedaan:
</para>

<para>
<screen>
# Stel kleuren in voor de diverse vensteronderdelen. Dit heeft 
# een enorme impact op de "feel" van je omgeving.
Color
{
    BorderColor "OrangeRed"
    BorderTileForeground "Black"
    BorderTileBackground "Black"
    TitleForeground "black"
    TitleBackground "gold"
    MenuForeground "black"
    MenuBackground "LightGrey"
    MenuTitleForeground "LightGrey"
    MenuTitleBackground "LightSlateGrey"
    MenuShadowColor "black"
    IconForeground "DimGray"
    IconBackground "Gold"
    IconBorderColor "OrangeRed"
    IconManagerForeground "black"
    IconManagerBackground "honeydew"
}

# Ik hoop dat je geen monochroom systeem hebt, maar 
# mocht dit wel zo zijn...
Monochrome
{
    BorderColor "black"
    BorderTileForeground "black"
    BorderTileBackground "white"
    TitleForeground "black"
    TitleBackground "white"
}

# Ik maakte beifang.bmp aan met het programma "bitmap".  
# Hier geef ik twm op het te gebruiken als het standaard 
# highlight patroon op titelbalken van vensters:
Pixmaps
{
    TitleHighlight "/home/larry/x/beifang.bmp"
}

# Maak je hier niet druk om, is slechts voor vergevorderden :-)
BorderWidth     2
TitleFont       "-adobe-new century schoolbook-bold-r-normal--14-140-75-75-p-87-iso8859-1"
MenuFont        "6x13"
IconFont        "lucidasans-italic-14"
ResizeFont      "fixed"
Zoom 50
RandomPlacement

# Deze programma's krijgen standaard geen venstertitelbalk:
NoTitle
{
  "stamp"
  "xload"
  "xclock"
  "xlogo"
  "xbiff"
  "xeyes"
  "oclock"
  "xoid"
}

# "AutoRaise" betekent dat een venster naar voren wordt gebracht 
# wanneer de muisaanwijzer binnen dit venster komt. Ik vind dit 
# hinderlijk, dus heb ik het uitgezet. Zoals je kunt zien, nam 
# ik mijn .twmrc over van mensen die autoraise ook maar niks vonden.
AutoRaise 
{
  "nothing"     # Ik houd niet van auto-raise  
                # Geldt ook voor mij  
                # en mij
}

# Hier worden de muisknopfuncties gedefineerd. Let op het patroon:
# een muisknop ingedrukt op het rootvenster, zonder ingedrukte 
# modifier toets, geeft altijd een menu. Andere lokaties resulteren 
# gewoonlijk in een of andere vorm van venstermanipulatie, en modifier
# toetsen worden in combinatie met de muisknoppen gebruikt om bij de 
# geavanceerdere venstermanipulaties te komen.
#
# Je hoeft dit patroon niet te volgen in je eigen .twmrc -- het is
# geheel aan jou hoe je je omgeving regelt.

# Button = KEYS : CONTEXT : FUNCTION
# ----------------------------------
Button1 =      : root    : f.menu "main"
Button1 =      : title   : f.raise
Button1 =      : frame   : f.raise
Button1 =      : icon    : f.iconify
Button1 = m    : window  : f.iconify

Button2 =      : root    : f.menu "stuff"
Button2 =      : icon    : f.move
Button2 = m    : window  : f.move
Button2 =      : title   : f.move
Button2 =      : frame   : f.move
Button2 = s    : frame   : f.zoom
Button2 = s    : window  : f.zoom

Button3 =      : root    : f.menu "x"
Button3 =      : title   : f.lower
Button3 =      : frame   : f.lower
Button3 =      : icon    : f.raiselower

# Je kunt eigen functies schrijven; deze wordt gebruikt in het menu
# "windowops" vrijwel aan het einde van dit bestand:
Function "raise-n-focus"
{
    f.raise
    f.focus
}

# Ok, hieronder staan de feitelijke menu's waarnaar wordt gerefereerd
# in het deel over de muisknoppen.  Veel van deze menu-ingangen roepen
# submenu's aan. Je kunt gebruik maken van zoveel niveaus in het menu
# als je wilt, maar wees je ervan bewust dat recursieve menu's niet 
# werken. Ik heb het geprobeerd.

menu "main"
{
"Vanilla"       f.title
"Emacs"         f.menu "emacs"
"Logins"        f.menu "logins"
"Xlock"         f.menu "xlock"
"Misc"          f.menu "misc"
}

# Hiermee kan ik emacs op verschillende machines aanroepen. Zie het deel
# over .rhosts bestanden voor meer informatie hoe dit werkt:
menu "emacs"
{
"Emacs"      f.title
"here"       !"/usr/bin/emacs &"
""           f.nop
"phylo"      !"rsh phylo \"emacs -d floss:0\" &"
"geta"       !"rsh geta \"emacs -d floss:0\" &"
"darwin"     !"rsh darwin \"emacs -d floss:0\" &"
"ninja"      !"rsh ninja \"emacs -d floss:0\" &"
"indy"       !"rsh indy \"emacs -d floss:0\" &"
"oberlin"    !"rsh cs.oberlin.edu \"emacs -d floss.life.uiuc.edu:0\" &"
"gnu"        !"rsh gate-1.gnu.ai.mit.edu \"emacs -d floss.life.uiuc.edu:0\" &"
}

# Hiermee kan ik xterms op verschillende machines aanroepen. Zie het 
# deel over .rhosts bestanden voor meer bestanden over hoe dit werkt:
menu "logins"
{
"Logins"     f.title
"here"       !"/usr/bin/X11/xterm -ls -T `hostname` -n `hostname` &"
"phylo"      !"rsh phylo \"xterm -ls -display floss:0 -T phylo\" &"
"geta"       !"rsh geta \"xterm -ls -display floss:0 -T geta\" &"
"darwin"     !"rsh darwin \"xterm -ls -display floss:0 -T darwin\" &"
"ninja"      !"rsh ninja \"xterm -ls -display floss:0 -T ninja\" &"
"indy"       !"rsh indy \"xterm -ls -display floss:0 -T indy\" &"
}

# De schermbeveiliging xlock, aangeroepen met diverse opties 
# (waarvan elk zorgt voor een ander aardig plaatje):
menu "xlock"
{
"Hop"   !"xlock -mode hop &"
"Qix"   !"xlock -mode qix &"
"Flame" !"xlock -mode flame &"
"Worm" !"xlock -mode worm &"
"Swarm" !"xlock -mode swarm &"
"Hop NL"   !"xlock -mode hop -nolock &"
"Qix NL"   !"xlock -mode qix -nolock &"
"Flame NL" !"xlock -mode flame -nolock &"
"Worm NL" !"xlock -mode worm -nolock &"
"Swarm NL" !"xlock -mode swarm -nolock &"
}

# Diverse programma's die ik zo nu en dan uitvoer:
menu "misc"
{
"Xload"         !"/usr/bin/X11/xload &"
"XV"            !"/usr/bin/X11/xv &"
"Bitmap"        !"/usr/bin/X11/bitmap &"
"Tetris"        !"/usr/bin/X11/xtetris &"
"Hextris"       !"/usr/bin/X11/xhextris &"
"XRoach"        !"/usr/bin/X11/xroach &"
"Analog Clock"  !"/usr/bin/X11/xclock -analog &"
"Digital Clock" !"/usr/bin/X11/xclock -digital &"
}

# Dit heb ik gekoppeld aan de middelste muisknop:
menu "stuff"
{
"Chores"       f.title
"Sync"         !"/bin/sync"
"Who"          !"who | xmessage -file - -columns 80 -lines 24 &"
"Xhost +"      !"/usr/bin/X11/xhost + &"
"Rootclear"    !"/home/larry/bin/rootclear &"
}

# X functies die weleens van nut kunnen zijn:
menu "x"
{
"X Stuff"               f.title
"Xhost +"               !"xhost + &"
"Refresh"               f.refresh
"Source .twmrc"         f.twmrc
"(De)Iconify"           f.iconify
"Move Window"           f.move
"Resize Window"         f.resize
"Destroy Window"        f.destroy
"Window Ops"            f.menu "windowops"
""                      f.nop
"Kill twm"              f.quit
}

# Submenu van het bovenstaande:
menu "windowops"
{
"Window Ops"            f.title
"Show Icon Mgr"         f.showiconmgr
"Hide Icon Mgr"         f.hideiconmgr
"Refresh"               f.refresh
"Refresh Window"        f.winrefresh
"twm version"           f.version
"Focus on Root"         f.unfocus
"Source .twmrc"         f.twmrc
"Cut File"              f.cutfile
"(De)Iconify"           f.iconify
"DeIconify"             f.deiconify
"Move Window"           f.move
"ForceMove Window"      f.forcemove
"Resize Window"         f.resize
"Raise Window"          f.raise
"Lower Window"          f.lower
"Raise or Lower"        f.raiselower
"Focus on Window"       f.focus
"Raise-n-Focus"         f.function "raise-n-focus"
"Destroy Window"        f.destroy
"Kill twm"              f.quit
}
</screen>
</para>

<para>
Wauw!  Geloof me, dat is zelfs nog niet eens de meest ingewikkelde
<filename>.twmrc</filename> die ik ooit heb gezien. Het is heel goed 
mogelijk dat er een aantal
fraaie voorbeeldbestanden van <filename>.twmrc</filename> bij je X pakket 
werden geleverd. Kijk eens in de directory <filename>/usr/lib/X11/twm/</filename> of <filename>/usr/X11/lib/X11/twm</filename> om erachter te komen wat 
daar staat.
</para>

<para>
Een fout waar je bij <filename>.twmrc</filename> voor uit moeten kijken is het vergeten de
&amp; achter een menuopdracht te plaatsen.
Als je bemerkt dat X bij het uitvoeren van bepaalde opdrachten gewoon
vastloopt, dan kan het zijn dat dit de oorzaak is.
Ga met <keycap>Ctrl-Alt-Backspace</keycap> uit X, bewerk <filename>.twmrc</filename>, 
en probeer het nogeens.
</para>
</sect2>

<sect2 id="fvwm-config-section"><title>Fvwm configuratie</title>
<para>
<indexterm><primary>fvwm</primary></indexterm>
Als je gebruik maakt van <application>fvwm</application> dan zijn tevens in de directory
<filename>/usr/lib/X11/fvwm/</filename> 
(of <filename>/usr/X11/lib/X11/fvwm/</filename>) een aantal goede
voorbeelden van configuratiebestanden te vinden.
</para>
</sect2>
</sect1>

<sect1 id="config-other-init"><title>Andere initbestanden</title>
<para>
Een aantal andere initialisatiebestanden zijn:
</para>

<para>
<informaltable frame="all">
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<tbody>
<row>
  <entry><filename>.emacs</filename></entry>
<entry>Wordt ingelezen door de teksteditor Emacs zodra het wordt opgestart
</entry>
</row>
<row>
<entry><filename>.netrc</filename></entry>
<entry>Geeft standaardloginnamen en wachtwoorden voor ftp</entry>
</row>
<row>
<entry><filename>.rhosts</filename></entry>
<entry>Maakt je account remote toegankelijk</entry>
</row>
<row>
<entry><filename>.forward</filename></entry>
<entry>Voor het automatisch doorsturen van mail</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>

<sect2 id="config-init-emacs"><title>Het initbestand van emacs</title>
<para>
Gebruik je <application>emacs</application> als je primaire editor, dan is het bestand
<filename>.emacs</filename> van groot belang. Het wordt uitgebreid behandeld in
<xref linkend="emacs-chapter"/>.
</para>
</sect2>

<sect2 id="config-ftp"><title>FTP standaards</title>
<para>
In het bestand <filename>.netrc</filename> kun je bepaalde standaardwaarden
voor <application>ftp</application> instellen voordat je <application>ftp</application> opstart. Hier is een beknopt voorbeeld
van <filename>.netrc</filename>:
</para>

<para>
<screen>
machine floss.life.uiuc.edu login larry password fishSticks
machine darwin.life.uiuc.edu login larry password fishSticks
machine geta.life.uiuc.edu login larry password fishSticks
machine phylo.life.uiuc.edu login larry password fishSticks
machine ninja.life.uiuc.edu login larry password fishSticks
machine indy.life.uiuc.edu login larry password fishSticks

machine clone.mcs.anl.gov login fogel password doorm@
machine osprey.mcs.anl.gov login fogel password doorm@
machine tern.mcs.anl.gov login fogel password doorm@
machine altair.mcs.anl.gov login fogel password doorm@
machine dalek.mcs.anl.gov login fogel password doorm@
machine juju.mcs.anl.gov login fogel password doorm@

machine sunsite.unc.edu login anonymous password larry@cs.oberlin.edu
</screen>
</para>

<para>
Op elke regel van <filename>.netrc</filename> staat de naam van een machine, 
een standaard te gebruiken loginnaam voor die machine en een wachtwoord.
Dit is erg handig als je veel gebruik maakt van <application>ftp</application> en het moe
bent constant je gebruikersnaam en wachtwoord van de diverse sites
in te moeten tikken.
Het <application>ftp</application> programma zal proberen je automatisch in te loggen met de 
informatie die het aantreft in het bestand <filename>.netrc</filename>, 
als je middels <application>ftp</application> met &eacute;&eacute;n van 
de machines vermeld in dit bestand verbinding maakt.
</para>

<para>
Je kunt <application>ftp</application> opgeven het bestand .netrc te negeren en geen automatische
login trachten uit te voeren door het aan te roepen met de optie
<option>-n</option>: "<command>ftp -n</command>".
</para>

<para>
Je moet ervoor zorgen dat het bestand <filename>.netrc</filename> 
<emphasis>alleen</emphasis> leesbaar is door jouzelf. Gebruik het programma 
<application>chmod</application> om de leespermissies van het bestand in te stellen. Als andere 
mensen het kunnen lezen, betekent dit dat ze achter je wachtwoord kunnen
komen van de diverse sites. Een groter beveiligingslek kan men
niet hebben; om je aan te moedigen dat je zorgvuldig te werk
gaat, zullen <application>ftp</application> en andere programma's die op 
zoek gaan naar het bestand <filename>.netrc</filename> weigeren te werken 
als de leespermissies van het bestand niet goed zijn ingesteld.
</para>

<para>
Er is meer te vertellen over het bestand <filename>.netrc</filename> dan 
wat ik zojuist heb aangegeven; geef de opdracht 
"<command>man .netrc</command>" of "<command>man ftp</command>"
als je daartoe even de kans ziet.
</para>
</sect2>

<sect2 id="config-remote-access"><title>Eenvoudig remote toegang tot je account toestaan</title>
<para>
Als in je homedirectory een bestand met de naam <filename>.rhosts</filename>
voorkomt, dan kun je op deze machine programma's remote uitvoeren.
Dat wil zeggen dat je op de machine <literal>cs.oberlin.edu</literal> zou 
kunnen zijn ingelogd, maar dat je met een correct geconfigureerd 
<filename>.rhosts</filename> bestand op <literal>floss.life.uiuc.edu</literal>,
een programma zou kunnen draaien op <literal>floss.life.uiuc.edu</literal> 
en de uitvoer naar <literal>cs.oberlin.edu</literal> zou kunnen
laten gaan zonder ooit in te hoeven loggen of een wachtwoord te hoeven 
intikken.
</para>

<para>
Een <filename>.rhosts</filename> kan er bijvoorbeeld zo uitzien:
</para>

<para>
<screen>
frobnozz.cs.knowledge.edu jsmith
aphrodite.classics.hahvaahd.edu wphilps
frobbo.hoola.com trixie
</screen>
</para>

<para>
Het formaat is tamelijk recht-toe-recht-aan: een machinenaam, gevolgd door
een gebruikersnaam. Stel bijvoorbeeld dat dit voorbeeld mijn 
<filename>.rhosts</filename>
bestand is op <literal>floss.life.uiuc.edu</literal>. Dat zou betekenen 
dat ik programma's op floss zou kunnen uitvoeren, de uitvoer naar een van de
opgesomde machines zou gaan, zolang ik ook zou zijn ingelogd als de
corresponderende gebruiker opgegeven voor die machines wanneer
ik dat probeerde.
</para>

<para>
Men voert gewoonlijk een remote programma uit via het programma
<application>rsh</application>. Het staat voor "remote shell". Het
start een shell op een remote machine en voert de opgegeven opdracht uit.
Bijvoorbeeld:
</para>

<para>
<screen>
<prompt>frobbo$ </prompt><userinput>whoami</userinput>
<computeroutput>trixie</computeroutput>
<prompt>frobbo$ </prompt><userinput>rsh floss.life.uiuc.edu "ls ~"</userinput>
<computeroutput>foo.txt    mbox   url.ps    snax.txt</computeroutput>
<prompt>frobbo$ </prompt><userinput>rsh floss.life.uiuc.edu "more ~/snax.txt"</userinput>
[snax.txt komt hier per scherm]
</screen>
</para>

<para>
Gebruiker trixie op floss.life.uiuc.edu, die het eerder getoonde 
voorbeeldbestand van <filename>.rhosts</filename> had, staat trixie op
frobbo.hoola.com expliciet toe programma's als trixie vanaf floss uit
te voeren.
</para>

<para>
Je hoeft op alle machines niet dezelfde gebruikersnaam te gebruiken wil
een <filename>.rhosts</filename> goed functioneren. Gebruik de optie 
"<option>-l</option>" van <application>rsh</application>, om de remote 
machine op te geven welke gebruikersnaam je graag wilt
gebruiken om in te loggen. Als die gebruikersnaam op de remote machine 
voorkomt en daarop een <filename>.rhosts</filename> bestand voorkomt met 
daarin je huidige (d.w.z.: local) machine en gebruikersnaam, dan lukt de 
<application>rsh</application>.
</para>

<para>
<screen>
<prompt>frobbo$ </prompt><userinput>whoami</userinput>
<computeroutput>trixie</computeroutput>
<prompt>frobbo$ </prompt><userinput>rsh -l larry floss.life.uiuc.edu "ls ~"</userinput>
[Voeg hier een listing in van mijn directory op floss]
</screen>
</para>

<para>
Dit werkt als gebruiker <literal>larry</literal> op 
<literal>floss.life.uiuc.edu</literal> een <filename>.rhosts</filename>
bestand heeft die <literal>trixie</literal> van 
<literal>frobbo.hoopla.com</literal> toestaat programma's in zijn account 
uit te voeren. Of het hier wel of niet om dezelfde persoon gaat is irrelevant: 
het enige wat belangrijk is, is de gebruikersnaam, de naam van de
machine en de regel in larry's <filename>.rhosts</filename> bestand op floss.  
</para>

<para>
Er zijn nog andere combinaties mogelijk die in een <filename>.rhosts</filename> bestand
kunnen worden geplaatst. Je kunt bijvoorbeeld de gebruikersnaam volgend op
een remote machinenaam achterwege laten waarmee je elke gebruiker van die
machine toestaat in jouw naam programma's uit te voeren op de lokale
machine! Dit is natuurlijk een beveiligingsrisico:
iemand zou op afstand een programma kunnen uitvoeren waarmee je bestanden
worden verwijderd, gewoon door een account op een bepaalde machine.
Als je iets doet als het achterwege laten van de gebruikersnaam,
dan moet je ervoor zorgen dat het <filename>.rhosts</filename> bestand alleen door
jou en niemand anders leesbaar is.
</para>
</sect2>

<sect2 id="config-mailforwarding"><title>Mail Forwarding</title>
<para>
Je kunt ook een <filename>.forward</filename> bestand hebben, wat strict genomen geen
"init bestand" is. Als hierin een e-mailadres staat, dan zal alle
mail bestemd voor jou in plaats daarvan worden doorgestuurd naar dat adres.
Dit is handig als je op meerdere systemen accounts hebt, en alleen
mail op &eacute;&eacute;n lokatie wilt lezen.
</para>

<para>
Er bestaan nog een boel andere mogelijke initialisatiebestanden.  Het
exacte aantal zal van systeem tot systeem varieren, en het is
afhankelijk van de software die op je systeem is ge&iuml;nstalleerd.
Een manier er meer over te leren is de bestanden in je homedirectory
te bekijken die met een "<literal>.</literal>" beginnen. Je hebt geen 
garantie dat deze bestanden allen init bestanden zijn, maar het is een goede
gok dat de meesten dit wel zijn.
</para>
</sect2>
</sect1>

<sect1 id="config-examples"><title>Een aantal voorbeelden bekijken</title>
<para>
Het laatste voorbeeld dat ik je kan geven is een draaiend Linux
systeem. Dus als je toegang hebt tot Internet, telnet dan gerust naar
<literal>floss.life.uiuc.edu</literal>. Log in als "guest", password "explorer",
en dool eens rond.  De meeste voorbeeldbestanden die hier zijn gegeven, zijn
te vinden in <filename>/home/kfogel</filename>, maar er zijn ook nog andere 
directory's. Je mag gerust alles kopi&euml;ren wat je kunt lezen. Wees 
alsjeblieft voorzichtig: floss is niet zo'n veilige box, en je kunt vrijwel 
zeker roottoegang verkrijgen als je het hard genoeg probeert. Ik geef de 
voorkeur aan vertrouwen in plaats van constante waakzaamheid om de beveiliging
te onderhouden.
</para>
</sect1>
</chapter><!--
% Local Variables: 
% mode: latex
% TeX-master: "guide"
% End: -->