forked from wikivisor/codermerlinwiki
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMultipageNavigation.xml
More file actions
1634 lines (1417 loc) · 74.8 KB
/
MultipageNavigation.xml
File metadata and controls
1634 lines (1417 loc) · 74.8 KB
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
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.11/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.11/ http://www.mediawiki.org/xml/export-0.11.xsd" version="0.11" xml:lang="en">
<siteinfo>
<sitename>Coder Merlin</sitename>
<dbname>wiki</dbname>
<base>https://dev.codermerlin.com/wiki/index.php/Welcome_to_Coder_Merlin</base>
<generator>MediaWiki 1.35.3</generator>
<case>first-letter</case>
<namespaces>
<namespace key="-2" case="first-letter">Media</namespace>
<namespace key="-1" case="first-letter">Special</namespace>
<namespace key="0" case="first-letter" />
<namespace key="1" case="first-letter">Talk</namespace>
<namespace key="2" case="first-letter">User</namespace>
<namespace key="3" case="first-letter">User talk</namespace>
<namespace key="4" case="first-letter">Coder Merlin</namespace>
<namespace key="5" case="first-letter">Coder Merlin talk</namespace>
<namespace key="6" case="first-letter">File</namespace>
<namespace key="7" case="first-letter">File talk</namespace>
<namespace key="8" case="first-letter">MediaWiki</namespace>
<namespace key="9" case="first-letter">MediaWiki talk</namespace>
<namespace key="10" case="first-letter">Template</namespace>
<namespace key="11" case="first-letter">Template talk</namespace>
<namespace key="12" case="first-letter">Help</namespace>
<namespace key="13" case="first-letter">Help talk</namespace>
<namespace key="14" case="first-letter">Category</namespace>
<namespace key="15" case="first-letter">Category talk</namespace>
<namespace key="102" case="first-letter">Property</namespace>
<namespace key="103" case="first-letter">Property talk</namespace>
<namespace key="106" case="first-letter">Form</namespace>
<namespace key="107" case="first-letter">Form talk</namespace>
<namespace key="108" case="first-letter">Concept</namespace>
<namespace key="109" case="first-letter">Concept talk</namespace>
<namespace key="112" case="first-letter">smw/schema</namespace>
<namespace key="113" case="first-letter">smw/schema talk</namespace>
<namespace key="114" case="first-letter">Rule</namespace>
<namespace key="115" case="first-letter">Rule talk</namespace>
<namespace key="274" case="first-letter">Widget</namespace>
<namespace key="275" case="first-letter">Widget talk</namespace>
<namespace key="828" case="first-letter">Module</namespace>
<namespace key="829" case="first-letter">Module talk</namespace>
<namespace key="2300" case="first-letter">Gadget</namespace>
<namespace key="2301" case="first-letter">Gadget talk</namespace>
<namespace key="2302" case="case-sensitive">Gadget definition</namespace>
<namespace key="2303" case="case-sensitive">Gadget definition talk</namespace>
<namespace key="3000" case="first-letter">Invigilators</namespace>
<namespace key="3001" case="first-letter">Invigilators talk</namespace>
<namespace key="3002" case="first-letter">Guides</namespace>
<namespace key="3003" case="first-letter">Guides talk</namespace>
</namespaces>
</siteinfo>
<page>
<title>Shell/Change Your Password</title>
<ns>0</ns>
<id>8554</id>
<revision>
<id>16895</id>
<parentid>16237</parentid>
<timestamp>2021-12-12T21:22:30Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16895</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="1169" sha1="9lz3hsdon8hluw9fn01uua2jzq8j4u5" xml:space="preserve">When you first log on to the server you'll have been assigned a password. You should change this password to something that is easy for you to remember but difficult for others to guess (or derive). (A good summary article of how to select strong passwords may be found [https://www.fpainc.com/blog/password-guidelines-from-nist here].)
The program that you'll use to change your password is '''passwd'''. It will prompt you three times.
* You'll first enter your current password
* then the new password that you want to use
* and then finally, to ensure that you're entering the new password correctly, you'll be prompted a second time for the new password.
{{Hint|
Remember that when you enter the password, what you type '''will not be echoed to the terminal'''. You'll just need to pretend that the your keypresses are being received.
}}
Change your default password to a strong password:
{{ConsoleLines|john-williams@codermerlin:~$ passwd<br/>
Changing password for john-williams.<br/>
(current) UNIX password:<br/>
Enter new UNIX password:<br/>
Retype new UNIX password:<br/>
passwd: password updated successfully
}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>9lz3hsdon8hluw9fn01uua2jzq8j4u5</sha1>
</revision>
</page>
<page>
<title>Shell/Clear the Screen</title>
<ns>0</ns>
<id>8552</id>
<revision>
<id>16893</id>
<parentid>16235</parentid>
<timestamp>2021-12-12T21:22:17Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16893</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="385" sha1="o0k95s32mhy9lgo5zdhgkt73ibvu6fj" xml:space="preserve">In some cases it’s useful to clear the screen. (For example, this might be useful if you sense your guide creeping up behind you when you were doing something that you weren’t supposed to be doing. 😁) We can do this with the clear command. Type '''clear''' and then press {{Key|RETURN}}.
{{ConsoleLine|john-williams@codermerlin:~$ |clear}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>o0k95s32mhy9lgo5zdhgkt73ibvu6fj</sha1>
</revision>
</page>
<page>
<title>Shell/Client and Server</title>
<ns>0</ns>
<id>8541</id>
<revision>
<id>16907</id>
<parentid>16902</parentid>
<timestamp>2021-12-12T21:41:14Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16907</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="1630" sha1="gheofqhcu5b3rg03onwq59gsb27v4n4" xml:space="preserve">[[File:Client-server-model.svg|thumb|link=|Client-server-model]] A '''client-server model''' is a means of distributing resources between the provider of a '''service''' and a consumer of that service, the client. You're likely very familiar with this concept though less familiar with the name. One common example of a service provided in this manner is email. You, a '''user''', can open an email '''client''' (for example, an app on your iPhone or Outlook on a PC) which then connects to a remote '''server'''. The ''server'' is responsible for providing several ''services'', including receiving mail on your behalf from other servers, transmitting email on your behalf to others, and storing your email for your later use.
{{Observe|Section 1|
# Name at least two other services that you personally use which are implemented using a Client/Server Model
}}
There are several advantages to this model:
* Users don't need to personally possess the hardware required to fulfill a particular service, only a means of connecting and communicating with a server which provides the service
* Users don't need to worry about installing and configuring the server hardware
* Users are able to access their data from anywhere in the world (as long as they have internet access)
* The state of a users data remains consistent, regardless of how and from where they access the server
Merlin is built upon this Client/Server Model, so you won't need any particular type of hardware or software, only a device capable of running a web-browser and a terminal emulator (available in Google Chrome).
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>gheofqhcu5b3rg03onwq59gsb27v4n4</sha1>
</revision>
</page>
<page>
<title>Shell/Deleting a File</title>
<ns>0</ns>
<id>8549</id>
<revision>
<id>16890</id>
<parentid>16232</parentid>
<timestamp>2021-12-12T21:20:33Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16890</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="341" sha1="ieky6zcg82ieq2b0or29acjjfrt2bwk" xml:space="preserve">We can delete a file with the '''rm''' (remove) command. Let's try it:
{{ConsoleLine|john-williams@codermerlin:~$ |echo "Hello" > hello.txt }}
{{ConsoleLine|john-williams@codermerlin:~$ |ls }}
{{ConsoleLine|john-williams@codermerlin:~$ |rm hello.txt }}
{{ConsoleLine|john-williams@codermerlin:~$ |ls }}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>ieky6zcg82ieq2b0or29acjjfrt2bwk</sha1>
</revision>
</page>
<page>
<title>Shell/Directories Revisited</title>
<ns>0</ns>
<id>8551</id>
<revision>
<id>16892</id>
<parentid>16234</parentid>
<timestamp>2021-12-12T21:20:58Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16892</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="2028" sha1="1ew4xmk4bhvubb4o7ezmmvjdyiclcrz" xml:space="preserve">There are useful shortcuts that you can use when specifying a path.
* "." (a single period or dot) refers to the ''current'' directory
* ".." (a double period, or two adjacent dots) refers to the ''parent'' directory, relative to wherever you happen to be in the path up to this point
Thus:
* To move to a ''parent'' directory, we can type {{Key|c}}{{Key|d}}{{Key|Space}}{{Key|.}}{{Key|.}}
* To move to a ''grandparent'' directory, we can type {{Key|c}}{{Key|d}}{{Key|Space}}{{Key|.}}{{Key|.}}{{Key|/}}{{Key|.}}{{Key|.}}
Assume we have a directory named 'parent' with two children, 'childA' and 'childB', and we are currently inside the 'childB' directory and want to enter the 'childA' directory.
* To move to a ''sibling'' directory, we can type {{Key|c}}{{Key|d}}{{Key|Space}}{{Key|.}}{{Key|.}}{{Key|/}}childA
=== View the Directory Hierarchy ===
Sometimes it’s helpful to obtain an overview of our directory hierarchy. We can do this with the '''tree''' command. Let's try:
{{ConsoleLine|john-williams@codermerlin:~$ |tree}}
{{ConsoleLines|
.<br/>
└─ Merlin<br/>
&nbsp;&nbsp;&nbsp;├─&nbsp;hello<br/>
&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;├─ newFile.txt<br/>
&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;└─ out.txt<br/>
&nbsp;&nbsp;&nbsp;├─&nbsp;hello2<br/>
&nbsp;&nbsp;&nbsp;└─&nbsp;hello3<br/>
}}
{{Observe|: Section 7|
# How does the '''ls''' command differ from the '''tree''' command?
# How do you choose to use one over the other?
}}
=== Remove a Directory ===
Let's remove the two directories that we won't be using anymore. We can do this with the '''rmdir''' command. Move to the Merlin directory and then remove the hello2 and hello3 directories. Then do a directory listing to see what’s left.
{{ConsoleLine|john-williams@codermerlin:~$ |cd Merlin}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |rmdir hello2}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |rmdir hello3}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |ls}}
{{ConsoleLine|hello|}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>1ew4xmk4bhvubb4o7ezmmvjdyiclcrz</sha1>
</revision>
</page>
<page>
<title>Shell/Directories</title>
<ns>0</ns>
<id>8545</id>
<revision>
<id>16886</id>
<parentid>16228</parentid>
<timestamp>2021-12-12T21:19:31Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16886</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="5788" sha1="284kppoc6ax78zym6cwy9lfcmlj22ur" xml:space="preserve">=== Directory Hierarchy ===
[[File:LinuxFileHierarchy.png|thumb|link=|Linux File Hierarchy]]
All files are integrated into a single, hierarchical directory structure that appears as an inverted tree. A '''directory''' provides a logical grouping of related files (and potentially other directories). The top of this tree is called the '''root''' and is referred to by a slash (/). In the diagram, we see that the root contains five '''subdirectories''' (i.e., a directory below the parent directory):
bin, etc, home, lib, and tmp. The home directory contains two subdirectories, jack-williams and john-williams. Note that this differs from a Windows file structure as Unix integrates all files into a single directory structure rather than listing different physical storage devices. Thus, the file structure is '''logical''' rather than '''physical'''. A '''path''' describes an ordered transition through one or more directories on the way to a destination (either a directory or a file). As such, note that while both jack-williams and john-williams each have a subdirectory named "projects" these are ''different'' directories. The path to the former is "/home/jack-williams/projects" while the path to the latter is "/home/john-williams/projects". Paths which begin at the root (symbolized by the initial slash) are called '''absolute paths'''. All other paths are '''relative paths'''.
{{Observe|: Section 2|
# It appears that both Jack Williams and John Williams can have a directory of the same name. Do you think the ability to have two different users create a directory of the same name is important? Why?
}}
=== Display the Working Directory (Where am I?) ===
The shell uses a concept known as your '''working directory''', which can be thought of as your current directory, i.e. where you are currently located in the file system. If you forget where you are, you can always use the command '''pwd''' to print the working directory. Try it now. Type “pwd” followed by <RETURN>. Note that you’ll need to press <RETURN> after any command before the shell will execute the command.
{{ConsoleLine|john-williams@codermerlin:~$ |pwd}}
{{ConsoleLine|/home/john-williams|}}
The command will print something similar to “/home/john-williams” and then present you with a new prompt and cursor to indicate that it’s ready and awaiting your input. This directory is your '''home directory''' and it has a special symbol, the '''tilde''' (~).
{{Observe|: Section 3|
# Why do you think the home directory has a special symbol to represent it?
}}
=== Create a New Directory ===
In order to keep our Merlin Missions organized, let’s place them all under a directory named “Merlin”. To make a new directory, we’ll use the command '''mkdir''' to which we’ll provide a single argument, the name of the directory that we want to create. Try it now. Type “mkdir Merlin” followed by <RETURN>.
{{ConsoleLine|john-williams@codermerlin:~$ |mkdir Merlin}}
=== Display the Contents of a Directory ===
How do we find out what’s contained in our current directory? We can use the '''ls''' (that’s a lowercase ‘L’ followed by a lowercase ’S’) command to list the directory contents. Try it now. Type “ls” followed by return.
{{ConsoleLine|john-williams@codermerlin:~$ |ls}}
The command will print the contents of the current directory (in this case our home directory) which will include the single directory, “Merlin”, that we created earlier.
=== Change to a New Directory ===
When we want to change our current directory we use the '''cd''' command followed by the name of the directory to which we want to change. Try it now. Type “cd Merlin”.
{{ConsoleLine|john-williams@codermerlin:~$ |cd Merlin}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |}}
{{Observe|: Section 4|
# Did the prompt change? If so, how? Why is this useful?
}}
Note that our prompt has now changed. Before the command was executed, the prompt contained a single tilde indicating that our home directory was our current directory. After executing the command our prompt now includes a tilde, followed by a slash, followed by “Merlin”. This indicates that we are in the directory named “Merlin” below our home directory. The slash is a '''delimiter''' separating the levels of our hierarchy.
Let’s try the ''pwd'' command again.
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |pwd}}
We can now see that from the root, we’re three levels down:<br/>
/ (root)<br/>
home<br/>
john-williams<br/>
Merlin<br/>
The ''cd'' command has a useful shortcut. If we type the command without an argument, it will take us back to our home directory. It’s the equivalent of "cd ~". Let’s try it now:
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |cd}}
{{ConsoleLine|john-williams@codermerlin:~$ |}}
Now, move back to the Merlin directory by issuing the appropriate command.
=== Change to a New Directory Temporarily ===
When we want to change our current directory ''temporarily'' (meaning we want to return later to where we are now), we use the '''pushd''' command followed by the name of the directory to which we want to change. Try it now. Type “pushd Merlin”.
{{ConsoleLine|john-williams@codermerlin:~$ |pushd Merlin}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |}}
We can now perform any actions we'd like in this directory and when we're done, we can easily return from whence we came without needing to type in the original directory name. The '''popd''' command will look up where we came (when we used '''pushd''') and return us to there. Try it now. Type '''popd'''.
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |popd}}
{{ConsoleLine|john-williams@codermerlin:~$ |}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>284kppoc6ax78zym6cwy9lfcmlj22ur</sha1>
</revision>
</page>
<page>
<title>Shell/Display a Manual</title>
<ns>0</ns>
<id>8555</id>
<revision>
<id>16896</id>
<parentid>16238</parentid>
<timestamp>2021-12-12T21:22:38Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16896</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="684" sha1="h9jsiymsrv2mqabke3ms8zaxwv4t1c1" xml:space="preserve">Finally, let's try out one more very helpful command. If we want to learn more about a command we can read its ''manual''. We do this with the command '''man'''. As an example, look at the man page for the emacs command. Type '''man emacs'''.
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |man emacs}}
The screen will be filled with information about the emacs command. While a man page is displayed we can use the following keys to navigate:
* Typing {{Key|f}} will move us forward one page in the manual
* Typing {{Key|b}} will move us backward one page in the manual
* Typing {{Key|q}} will quit (exit the manual)
Exit the manual now.
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>h9jsiymsrv2mqabke3ms8zaxwv4t1c1</sha1>
</revision>
</page>
<page>
<title>Shell/Exiting the Shell</title>
<ns>0</ns>
<id>8556</id>
<revision>
<id>16897</id>
<parentid>16239</parentid>
<timestamp>2021-12-12T21:22:54Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16897</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="479" sha1="0l09uqwjvyvs5t0pavinj5xgp8j9iwa" xml:space="preserve">In general, there's no need to exit the shell. It's almost always sufficient to close your terminal emulator. An advantage to this approach is that the next time you connect to the server you'll be in exactly the same place where you left off. However, on rare occasions the terminal emulator can become "confused" and display characters in odd places. In such a case, there's still no need to exit; instead, use the '''reset''' command.
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>0l09uqwjvyvs5t0pavinj5xgp8j9iwa</sha1>
</revision>
</page>
<page>
<title>Shell/Files</title>
<ns>0</ns>
<id>8548</id>
<revision>
<id>16889</id>
<parentid>16231</parentid>
<timestamp>2021-12-12T21:20:26Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16889</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="3336" sha1="3vvfe756jwhet85jhxffwcv6fn53zqq" xml:space="preserve">=== Echo to the Screen ===
The echo command echoes the argument to the output. Let’s try it. Type: '''echo "Hello, World!"''' The echo command dutifully echoes the argument to the screen. Try it now:
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |echo "Hello, World!"}}
{{ConsoleLine|Hello, World!|}}
=== Create an Empty File ===
The touch command creates a new, empty file, if such a file does not already exist. If such a file does already exist, the access and modification times will be set to the current time. Try it now:
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |touch newFile.txt}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |ls}}
{{ConsoleLine|newFile.txt|}}
We'll see the '''cat''' command more below, but for now it's enough to understand that it will display the contents of a file. Because this is a new, empty file, nothing will be displayed. Try it now:
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |cat newFile.txt}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |}}
=== Redirection ===
Remember that we said that almost everything in Unix is either a file or a process and that the screen could be considered as a file. We can '''redirect''' the output from echo to another file, one that we'll store in the file system. We do this with the > (greater-than) symbol. Normally, commands will send their output to a device called '''stdout'''. This is what the echo command did when we used it earlier. In our case, stdout is printed to our terminal. Let’s try to redirect our output to a file. Type: '''echo "Hello, World!" > out.txt''':
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |echo "Hello, World!" > out.txt}}
{{Observe|: Section 6|
# Was "Hello, World!" printed to the screen as before? If not, why not? What do you think happened to the text?
}}
No output was displayed; we just received a new prompt. Let’s use the '''ls''' command to take a look:
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |ls}}
{{ConsoleLine|newFile.txt out.txt|}}
We can see that the directory contains a single file, "out.txt" which was created by the echo command. How can we see what's contained within this file?
=== Quickly View File Contents ===
To quickly view the contents of a file we can use the '''cat''' command. The cat command '''concatenates''' files together and then sends the output to stdout. (Remember that in our case this is the screen.) Let’s try it. Type "cat out.txt".
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |cat out.txt}}
{{ConsoleLine|Hello, World!|}}
=== Append a Small Amount of Text to an Existing File ===
If we already have an existing file with some text we can '''append''' (add text to the end) of this file by using echo and redirection as before but with ''two'' "greater-than" symbols adjacent to one another. Try it now. Type: echo "Hello, again!" >> out.txt
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |echo "Hello, again!" >> out.txt}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |}}
Let’s move back up to our home directory. Remember that we can do this by typing "cd" without any arguments.
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |cd}}
{{ConsoleLine|john-williams@codermerlin:~$ |}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>3vvfe756jwhet85jhxffwcv6fn53zqq</sha1>
</revision>
</page>
<page>
<title>Shell/First Connection</title>
<ns>0</ns>
<id>8542</id>
<revision>
<id>16903</id>
<parentid>16225</parentid>
<timestamp>2021-12-12T21:35:53Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16903</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="1634" sha1="q6qid6hch3ccn3dncwl3u07nzjv6qb2" xml:space="preserve">Coder Merlin is a cloud-based server where we’ll be doing most of our exercises. To access Merlin, you’ll need a '''secure shell client'''.
If you’re using a Mac or a Linux based device you’ll probably have a built-in client that you can access from the terminal.
If you’re using a Windows-based device, you can access a terminal by installing Google Chrome, and then within Google Chrome typing “Secure Shell Extension” and then installing the extension.
Either way, you’ll need a connection string to access the server. The connection string will begin with your first name and last name separated by a hyphen, for example: '''john-williams'''. The rest of the connection string will be '''@ssh.codermerlin.com'''
For John Williams, the entire connection string would be:
{{ConsoleLine||john-williams@ssh.codermerlin.com}}
After you’re connected, you’ll be prompted to enter your password. After a successful logon, you'll land in the "shell".
{{Hint|
You won't see your password being echoed to the terminal as you type it. This occurs to keep others from easily seeing your password. Just believe that your keypresses are being received correctly.}}
{{Caution|
The correct connection string, like many identifiers that you'll encounter in computer science, must be entered exactly. There is no tolerance for any variance. As such, pay close attention to the requirements. If you make a mistake, you may be locked out of the server for a period of time. If this happens, verify the connection string and your password, wait a while, then try again.}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>q6qid6hch3ccn3dncwl3u07nzjv6qb2</sha1>
</revision>
</page>
<page>
<title>Shell/Jobs</title>
<ns>0</ns>
<id>8553</id>
<revision>
<id>16894</id>
<parentid>16236</parentid>
<timestamp>2021-12-12T21:22:23Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16894</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="5030" sha1="hol22wijzbzty10jyb66evqmbq58x0f" xml:space="preserve">A '''program''' is an executable file which contains a series of instructions which can be executed by the computer. A '''process''' is a ''program'' which is ''being executed'' on the computer. The shell manages processes using the concept of a '''job'''. You can obtain a list of jobs and suspend and resume jobs. This functionality enables you to maximize your use of time rather than wait for the prompt to return as the shell waits for the execution of a job to complete.
=== Identifying Jobs ===
The shell provides several different ways to identify a job:
* <code>%''n''</code> - The specific job number is preceded by a percentage sign
* <code>%+</code> - A shortcut to specify the current job
* <code>%-</code> - A shortcut to specify the previous job
=== Listing Jobs ===
Jobs may be listed with the '''jobs''' command. Let's try an example by executing a few long-running jobs. The '''sleep''' command simply waits before returning. Let's try it:
{{ConsoleLine|john-williams@codermerlin:~$|sleep 3}}
Let's try it again:
{{ConsoleLine|john-williams@codermerlin:~$|sleep 5}}
{{Observe|: Section 8|
# What do you think the argument to sleep specifies?
# Are you able to prove your hypothesis? How?
}}
These same jobs can be executed in the background (more on this below) simply by specifying an ampersand (&) after the command.
Let's try it:
{{ConsoleLine|john-williams@codermerlin:~$|sleep 60 &}}
{{Observe|: Section 9|
# How is the behavior different from what you expected?
# What do you think it means to run a job in the background?
# What do you think the number displayed in brackets specifies?
}}
Let's run several jobs in the background and then view a list of our jobs:
{{ConsoleLine|john-williams@codermerlin:~$|sleep 40 &}}
{{ConsoleLine|john-williams@codermerlin:~$|sleep 30 &}}
{{ConsoleLine|john-williams@codermerlin:~$|sleep 20 &}}
Now, let's use the '''jobs''' command:
{{ConsoleLine|john-williams@codermerlin:~$|jobs}}
Repeatedly execute the '''jobs''' command.
{{Observe|: Section 10|
# What do you observe as you execute the '''jobs''' command?
# How do you explain your observations?
}}
=== Terminating a Job ===
While a job is executing, we may decide that we want to terminate it. Perhaps it is taking too long or we began executing it with the wrong arguments. We can often terminate the job with a special key sequence, {{SpecialKey|CONTROL|C}}.
Let's try an example. We'll execute the '''cat''' command without any arguments, which will cause it to wait for something to be entered on the console.
{{ConsoleLine|jane-williams@codermerlin:~$|cat}}
The process is now waiting. If we realize that we made a mistake (perhaps we wanted to print the contents of a file and forgot to specify the file's name) we can terminate the job. Try it now by pressing {{SpecialKey|CONTROL|C}}.
=== Foreground Jobs ===
Generally, when we execute a program we run it in the '''foreground'''. This means that our shell will execute the process and we won't be able to execute the next command until the currently running foreground process exits. This is ideal for short, interactive programs. Whenever we execute a program, running that program in the foreground is the default. For example, the '''find''' command can search for all files and directories within our home directory. Let's try it:
{{ConsoleLine|jane-williams@codermerlin:~/Merlin$|cd}}
{{ConsoleLine|jane-williams@codermerlin:~$|find}}
We'll likely see a long list of files and directories quickly scroll by. But what if we want to generate a list of all of the files and directories on the entire server? This can take a while. Let's try it, just for fun:
{{ConsoleLine|jane-williams@codermerlin:~/$|find /}}
Eventually we'll encounter a permissions error and the process will halt. But if you don't have the patience to wait, remember that you can use the key sequence {{SpecialKey|CONTROL|C}} to terminate the process immediately. Alternatively, we can use the key sequence {{SpecialKey|CONTROL|Z}} to ''suspend'' the process. When we suspend a process we can resume it in the foreground with '''fg''' followed by the job number.
=== Background Jobs ===
When we have a complex process that will take a long time to execute we don't want to be blocked from executing other commands while we wait for the long-running process to finish. In these cases, we can execute the long-running process in the '''background'''. Running the program in the background means that the process will continue to execute but we'll be able to enter new commands immediately. We saw an example of this above where we executed multiple '''sleep''' jobs simultaneously. We were able to do so because the shell was ready to accept new input ''before'' the previous job completed.
We can begin a job in the background by using an ampersand (&) after typing the command. When we suspend a process we can resume it in the background with '''bg''' followed by the job number.
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>hol22wijzbzty10jyb66evqmbq58x0f</sha1>
</revision>
</page>
<page>
<title>Shell/Recall Previous Commands</title>
<ns>0</ns>
<id>8547</id>
<revision>
<id>16888</id>
<parentid>16230</parentid>
<timestamp>2021-12-12T21:20:22Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16888</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="608" sha1="pgioyzyjwr6ab6uy23hecp7vmz4fxbe" xml:space="preserve">Sometimes it's expedient to quickly recall a previous command without the need to re-type it. The most common means of accomplishing this is to use the up-arrow. Let's try it:
{{ConsoleLine|john-williams@codermerlin:~$ |ls}}
Now, let's repeat the command, but rather than type '''ls''' again, try typing the up-arrow:
{{ConsoleLine|john-williams@codermerlin:~$ |{{Key|↑}}}}
Try pressing the {{Key|↑}} and {{Key|↓}} several times.
{{Observe|: Section 5|
# What happens each time you press the {{Key|↑}}?
# What happens each time you press the {{Key|↓}}?
}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>pgioyzyjwr6ab6uy23hecp7vmz4fxbe</sha1>
</revision>
</page>
<page>
<title>Shell/Renaming a File</title>
<ns>0</ns>
<id>8550</id>
<revision>
<id>16891</id>
<parentid>16233</parentid>
<timestamp>2021-12-12T21:20:50Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16891</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="350" sha1="k6512kqoudu7g3x8lkks176lnjl9pu6" xml:space="preserve">We can rename a file with the '''mv''' (move) command. Let's try it:
{{ConsoleLine|john-williams@codermerlin:~$ |echo "Hello" > hello.txt }}
{{ConsoleLine|john-williams@codermerlin:~$ |ls }}
{{ConsoleLine|john-williams@codermerlin:~$ |mv hello.txt goodbye.txt}}
{{ConsoleLine|john-williams@codermerlin:~$ |ls }}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>k6512kqoudu7g3x8lkks176lnjl9pu6</sha1>
</revision>
</page>
<page>
<title>Shell/Tab Completion</title>
<ns>0</ns>
<id>8546</id>
<revision>
<id>16887</id>
<parentid>16229</parentid>
<timestamp>2021-12-12T21:20:17Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16887</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="2040" sha1="525pludhvvz4eji8j24xach52jdj0kr" xml:space="preserve">Very often, the shell can help us to complete file and directory names when we begin to type the name of a file (or directory) and then type {{Key|TAB}}. Try it now. Type "cd M" and then press {{Key|TAB}}. The shell will complete the rest of the name by appending "erlin" to what you’ve already typed. Then press {{Key|ENTER}}. Because the completion is not ambiguous (i.e. there is only one solution) the shell will complete the name. If there were multiple possibilities, the shell would complete as much as possible and then beep. At this point, we could press {{Key|TAB}} twice in succession to see the possible completions. Let’s try this. Within the Merlin directory, create three new directories: hello, hello2, and hello3:
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |mkdir hello}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |mkdir hello2}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |mkdir hello3}}
Then, type “cd h”:
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |cd h}}
Now, press {{Key|TAB}}. The shell will complete as much of the name as possible and then beep. (Depending on your terminal you may not hear the beep or you may see a flash.)
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |cd hello}}
Now press {{Key|TAB}} twice in succession. The shell will display matching possibilities and then provide a new prompt followed by the previous entry:
{{ConsoleLine|hello/ hello2/ hello3/|}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |cd hello}}
You now have the option of pressing {{Key|ENTER}} to accept "hello" or adding some more characters (in this case “2” to form “hello2” or “3” to form “hello3”) and then pressing {{Key|ENTER}} to execute the command as-is or {{Key|TAB}} to search for additional completions. In our case, let’s press {{Key|ENTER}} to descend into the "hello" directory:
{{ConsoleLine|john-williams@codermerlin:~/Merlin$ |cd hello}}
{{ConsoleLine|john-williams@codermerlin:~/Merlin/hello$ |}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>525pludhvvz4eji8j24xach52jdj0kr</sha1>
</revision>
</page>
<page>
<title>Shell/Terminating a Partial Command</title>
<ns>0</ns>
<id>8544</id>
<revision>
<id>16885</id>
<parentid>16227</parentid>
<timestamp>2021-12-12T21:19:22Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16885</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="830" sha1="n3y42h9u7f03pdwdoilxxt32o40pqg4" xml:space="preserve">If you begin a command in error or change your mind about issuing a command, you can use the {{SpecialKey|CONTROL|C}} key sequence to cancel what you've typed so far and continue with a new command prompt.
Try it now:
{{ConsoleLine|john-williams@codermerlin:~$ |echo iThoughtIKnewWhatIWasDoingBut {{SpecialKey|CONTROL|C}} }}
{{Hint|
If you began issuing a command but need to do something else in the shell before actually issuing it, an alternative to the above is to temporarily store what you've typed so far, do something else, then return to the original command. You can do that with:
{{{Bar}} class{{Equal}}"wikitable"
{{Bar}}{{SpecialKey|CONTROL|U}}
{{Bar}} Cut backwards
{{Bar}}-
{{Bar}}{{SpecialKey|CONTROL|Y}}
{{Bar}} Yank the original text back
{{Bar}}}
}}
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>n3y42h9u7f03pdwdoilxxt32o40pqg4</sha1>
</revision>
</page>
<page>
<title>Shell/The Shell</title>
<ns>0</ns>
<id>8543</id>
<revision>
<id>16884</id>
<parentid>16323</parentid>
<timestamp>2021-12-12T21:19:15Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16884</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="1759" sha1="c2ez6zc96y1uuwab7acikr52lwphzzd" xml:space="preserve">A shell is a user interface which provides access to an operating system’s services. There are two basic types of shells: a “command-line interface” (CLI) and a “graphical user interface” (GUI). You are likely familiar with common GUI’s from Microsoft Windows and perhaps Apple’s macOS. This document will focus on a CLI known as '''bash''', a shell for the Unix operating system by Brian Fox. '''Bash''' is an acronym for Bourne-again shell, named for the Bourne shell that it replaces.
Login to the Merlin Server as discussed previously. After some introductory text, you’ll see a '''prompt''' (letting you know that the server is ready and waiting for your input) which will look something like this:
{{ConsoleLine|john-williams@codermerlin:~$|}}
You’ll see your login name, an at (@) sign, the name of the server (“codermerlin”), a colon (:), a tilde (~), and a $. This will be followed by a flashing block called a '''cursor'''. The cursor indicates where new characters will appear as you type. The cursor will continue to flash patiently as it awaits input. We’ll get back to the meaning of the tilde soon.
We'll be using a server running Linux, a Unix-like operating system. Almost everything in Unix is either a file or a process. A '''file''' is either a destination or source for a stream of data. A '''process''' is a program that is being executed by the operating system. While printers and screens are considered to be “files” in Unix, a more general way of thinking of files is a collection of data that can be referred to by name. Files can be created by users directly (for example, via a text editor) or indirectly, such as the result of running a program like a compiler.
{{MerlinMultipageExperienceNavBar}}</text>
<sha1>c2ez6zc96y1uuwab7acikr52lwphzzd</sha1>
</revision>
</page>
<page>
<title>Shell</title>
<ns>0</ns>
<id>1046</id>
<revision>
<id>16911</id>
<parentid>16910</parentid>
<timestamp>2021-12-12T21:53:29Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>32224</id>
</contributor>
<origin>16911</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="6071" sha1="g0yce168ky4rop8ip43f3hqdlvl0uqg" xml:space="preserve">== Curriculum ==
{{MerlinCurriculumData|{{ROOTPAGENAME}}}}
== Experience ==
{{MerlinMultipageExperienceSubpages
|Pages=Client and Server;First Connection;The Shell;Terminating a Partial Command;Directories;Tab Completion;Recall Previous Commands;Files;Deleting a File;Renaming a File;Directories Revisited;Clear the Screen;Jobs;Change Your Password;Display a Manual;Exiting the Shell
}}
{{SeeAlso|
[[Category:Linux||Bash||SSH client||SFTP client]]|
* https://en.wikipedia.org/wiki/Operating_system
* https://en.wikipedia.org/wiki/System_software
* https://en.wikipedia.org/wiki/Computer_hardware
* https://en.wikipedia.org/wiki/Application_software
* https://en.wikipedia.org/wiki/Shell_(computing)
* https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix/Files_and_Processes
* https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix/Directory_Structure
* https://unix.stackexchange.com/questions/89114/what-does-the-jargon-filesystem-mean
* http://www.aboutlinux.info/2005/05/job-control-in-linux.html
* https://www.cis.gvsu.edu/linux-tutorial-job-control/
* https://unix.stackexchange.com/questions/4214/what-is-the-difference-between-a-job-and-a-process
}}
== Key Concepts ==
{{KeyConcepts|
* A '''client-server model''' is a means of distributing resources between the provider of a service and a consumer of that service, the client. The advantages of this model include:
** Users don't need to personally possess the hardware and software required to implement the service
** Users don't need to worry about installation and configuration
** Users are able to access their data from anywhere in the world
** The state of a users data remains consistent, regardless of how and from where they access the server
* A '''shell''' is a user interface which provides access to an operating system’s services. There are two basic types of shells:
** A '''command-line interface''' (CLI)
** A '''graphical user interface''' (GUI)
* A '''prompt''' lets you know that the server is ready and waiting for your input
* A '''cursor''' is a flashing block which indicates where new characters will appear as you type
* A '''file''' is either a destination or source for a stream of data
* A '''process''' is a program that is being executed by the operating system
* All files are integrated into a single, hierarchical structure called a '''directory'''
** A directory provides a ''logical grouping'' of related files (and potentially other directories)
** The top of this tree is called the '''root''' and is referred to by a slash (/)
** A '''subdirectory''' is a directory contained within another directory, called the '''parent directory'''
** On Unix systems, the file structure is ''logical'' rather than ''physical''
** A '''path''' describes an ordered transition through one or more directories on the way to a destination (either a directory or a file)
*** Paths which begin at the root (symbolized by the initial slash) are called '''absolute paths'''
*** All other paths are '''relative paths'''
** Your '''home directory''' is indicated by a special symbol, the ''tilde'' (~)
** Your '''working directory''' can be thought of as your current directory
** The command '''pwd''' prints the working directory
** The command '''mkdir''' creates a new directory
** The command '''ls''' lists the contents of a directory
** The command '''cd''' changes your working directory
** The command '''pushd''' changes our working directory temporarily
** The command '''popd''' returns us to our previous directory after executing pushd
** The command '''tree''' displays a directory hierarchy
** The command '''rmdir''' removes (deletes) a directory
* The '''echo''' command echoes the argument to the output
* The '''touch''' command creates a new, empty file, if such a file does not already exist. If such a file does already exist, the access and modification times will be set to the current time.
* The greater-than symbol (>) can be used to ''redirect'' output to a file
* Two greater-than symbols (>>) can be used to ''append'' output to a file
* The '''cat''' command allows us to quickly view the contents of one or more files
* The '''rm''' command is used to remove (delete) a file
* The '''mv''' command is used to either move or rename a file
* The '''clear''' command clears the screen
* A '''program''' is an executable file which contains a series of instructions which can be executed by the computer
* A '''process''' is a program which is ''being executed'' on the computer
* The shell manages processes using '''jobs'''
* The '''jobs''' command will list the current jobs associated with your shell
** A job can be terminated by using the key sequence {{SpecialKey|CONTROL|C}}
** A job can be suspended by using the key sequence {{SpecialKey|CONTROL|Z}}
** A job can be resumed in the foreground with '''fg'''
** A job can be resumed in the background with '''bg'''
* The '''man''' command displays the contents of a manual
* The '''reset''' command resets your terminal
}}
== Exercises ==
{{Exercises|
Using pencil and paper, answer all questions in this experience.
<hr/>
''After completing W1005:''
* {{JournalAssignment|J1002}}
<hr/>
''After completing W1008:''
* {{MMMAssignment|M1002-10}}
* {{MMMAssignment|M1002-31}}
}}
{{Experience
|experienceID=W1002
|experienceUnit=Lab basics
|knowledgeAndSkills=§10.121
|topicAreas=SSH clients;Linux;Bash
|classroomTime=1 hour
|studyTime=3 hours
|acquiredKnowledge=differentiate between a CLI and GUI;
understand files, directories, and their organizational hierarchy;
understand of the client-server model;
understand processes;
understand the purpose of a prompt and cursor
|acquiredSkill=ability to append text to an existing file;
ability to create new text files;
ability to create new, empty files;
ability to delete files and directories;
ability to move and rename files and directories;
ability to successfully determine location in the file hierarchy;
ability to successfully navigate the file hierarchy;
ability to suspend and resume processes;
ability to terminate processes;
}}</text>
<sha1>g0yce168ky4rop8ip43f3hqdlvl0uqg</sha1>
</revision>
</page>
<page>
<title>Property:Course page</title>
<ns>102</ns>
<id>8597</id>
<revision>
<id>16636</id>
<timestamp>2021-12-06T17:27:11Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>30524</id>
</contributor>
<comment>Created a property of type Page</comment>
<origin>16636</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="46" sha1="jk9aupditbfg4coza27xh6berm5n0sp" xml:space="preserve">This is a property of type [[Has type::Page]].</text>
<sha1>jk9aupditbfg4coza27xh6berm5n0sp</sha1>
</revision>
</page>
<page>
<title>Property:Course page number</title>
<ns>102</ns>
<id>8596</id>
<revision>
<id>16635</id>
<timestamp>2021-12-06T17:26:55Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>30524</id>
</contributor>
<comment>Created a property of type Number</comment>
<origin>16635</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="48" sha1="id8gn0keu2a1u84x5rhv7b3oxwkgls6" xml:space="preserve">This is a property of type [[Has type::Number]].</text>
<sha1>id8gn0keu2a1u84x5rhv7b3oxwkgls6</sha1>
</revision>
</page>
<page>
<title>Template:MerlinMultipageExperienceSubpages</title>
<ns>10</ns>
<id>8599</id>
<revision>
<id>16705</id>
<parentid>16704</parentid>
<timestamp>2021-12-06T22:15:32Z</timestamp>
<contributor>
<username>Anton-krom</username>
<id>30524</id>
</contributor>
<origin>16705</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="1575" sha1="59015dsu38f2zm4es4gxyuur51ymms4" xml:space="preserve"><includeonly><div class="d-none">
{{#set:Sequenced subpages={{{Pages|}}}}}
{{#arraydefine: slides
|{{{Pages|}}}
|;
}}
{{#arrayprint: slides
|
|@
|{{#subobject:@
|Course page={{FULLPAGENAME}}/@
|Course page number={{#expr:0{{#arraysearch:slides|@}}+1}}
}}
}}
</div>
<div class="plainlinks mt-4 {{#ifeq: {{#titleparts:{{FULLPAGENAME}}||-1}}|All|d-none}}"><!--
-->[[{{FULLPAGENAME}}/{{#arrayindex: slides|0}}|<span class="btn btn-lg btn-dark text-white">{{{1|Start}}}</span>]] <!--
-->{{#if: {{#ask: [[{{FULLPAGENAME}}/All]][[Modification date::+]] }}
|[[{{FULLPAGENAME}}/All|<span class="btn btn-lg btn-link">One page</span>]]
|[{{fullurl:{{FULLPAGENAME}}/All|action=edit&preload=Template:MerlinMultipageExperienceAllPreload}} <span class="btn btn-lg btn-link">One page</span>]
}}
</div>__NOTOC__
</includeonly>
<noinclude>
Converts a page into a cover page of an education course.
;Usage
<pre class="linenum">
{{MerlinMultipageExperienceSubpages
|Pages = # the ordered list of subpages delimited by a semicolon
| # the first unnamed parameter is used as the start button label (default = Start)
}}</pre>
;Example
<pre class="linenum">
{{MerlinMultipageExperienceSubpages
|Pages=Sample Course/Student Welcome;
Merlin History;
Merlin Video;
Merlin
|Start training
}}</pre>
; Related stuff
:Properties
:* [[Property:Course page]]
:* [[Property:Course page number]]
:Templates
:* [[Template:MerlinMultipageExperienceAll]]
:* [[Template:MerlinMultipageExperienceAllPreload]]
:* [[Template:MerlinMultipageExperienceNavBar]]
</noinclude></text>
<sha1>59015dsu38f2zm4es4gxyuur51ymms4</sha1>
</revision>
</page>
<page>
<title>Template:MerlinMultipageExperienceAllPreload</title>
<ns>10</ns>
<id>8600</id>
<revision>
<id>16695</id>
<parentid>16694</parentid>
<timestamp>2021-12-06T22:08:22Z</timestamp>