Strona zawiera przykładowe pytania jakie mogą pojawić się na teście.
\\
Pytania na teście będą podobnego rodzaju, natomiast poniższe przykładowe pytania
nie wyczerpują całego zakresu materiału.
==== Bash ====
**~~#~~.**
Podaj __początek__ skryptu który sprawdzi czy został uruchomiony z dwoma
argumentami i czy drugi z nich jest ścieżką do istniejącego katalogu.
\\
Jeśli któryś z tych warunków nie jest spełniony, skrypt ma wyświetlić na ekranie
odpowiednio komunikat ''Skrypt musi mieć dwa argumenty!'' lub ''Drugim
argumentem musi być ścieżka do istniejącego katalogu!'' i wyjść. W przeciwnym
razie skrypt ma kontynuować pracę.
**~~#~~.**
Podaj __początek__ skryptu który sprawdzi czy został uruchomiony z przynajmniej
dwoma argumentami i czy suma dwóch pierwszych argumentów jest parzysta.
\\
Jeśli któryś z tych warunków nie jest spełniony, skrypt ma wyświetlić na ekranie
odpowiednio komunikat ''Skrypt musi mieć co najmniej dwa argumenty!'' lub
''Suma dwóch pierwszych argumentów nie jest parzysta!''
i wychodzić. W innym przypadku skrypt ma kontynuować pracę.
--------------------------
**~~#~~.**
Podaj komendę lub komendy które wypiszą pięć losowych liczb z zakresu 100-499.
\\
Podpowiedź: do rozwiązania może przydać się zmienna ''RANDOM''
**~~#~~.**
Napisz skrypt który przyjmuje dwa argumenty - szerokość i wysokość, a następnie
rysuje (używając znaków ''#'') ramkę tych rozmiarów.
\\
Załóż że skrypt zawsze będzie wywoływany z poprawnymi argumentami, tzn. dwoma
liczbami większymi niż 2.
\\
Przykładowe wjście skryptu dla wywołania przez ''./script.sh 15 4'':
##############
# #
# #
##############
**~~#~~.**
Podaj treść skryptu, który dla każdego z argumentów:
* sprawdzi czy argument jest zwykłym plikiem
* jeżeli nie jest, wyświetli komunikat ''//ARG// nie jest plikiem'', gdzie //ARG// ma być wartością argumentu
* jeżeli jest, wyświetli jego nazwę oraz pierwszą i ostatnią linię
**~~#~~.**
Podaj treść skryptu, który dla każdego pliku z rozszerzeniem ''.rc'' z katalogu
''/etc'' wypisze nazwę pliku oraz linie nie zaczynające się od ''#''.
Oczywiście skrypt ma działać również w przypadku jeśli któryś plik ma
spację w nazwie.
**~~#~~.**
Katalog ''/usr/share/figlet/fonts'' zawiera pliki rozszerzeniami
''.flf'' – czcionkami programu ''figlet''.
\\
Żeby użyć np. czcionki ''/usr/share/figlet/fonts/block.flf'' do wypisania
tekstu //Text// można wykonać ''figlet -f block //Text//''.
\\
Podaj komendę lub komendy które stworzą funkcję o nazwie ''allFonts'',
która podany jako pierwszy argument tekst wypisze programem ''figlet''
kolejno w każdej z dostępnych czcionek, poprzedzając każde wypisanie nazwą
czcionki.
\\
Przykładowy wynik wywołania funkcji:
user@host ~ $ allFonts Tekst
(...)
small
_____ _ _
|_ _|__| |__ __| |_
| |/ -_) / /(_-< _|
|_|\___|_\_\/__/\__|
smscript
_____
() | _ |) , _|_
||/ |/) / \_|
(/ |_/| \/ \/ |_/
(...)
--------------------------
**~~#~~.**
Podaj treść skryptu który będzie na koniec pliku podanego jaki pierwszy argument
dopisywać wynik polecenia ''fortune'' dopóki plik nie będzie mieć przynajmniej
42 linii. Jeśli wskazany plik nie istnieje, należy go stworzyć.
**~~#~~.**
Napisz funkcję o nazwie ''getNextLogFile'', która najpierw będzie w pętli
sprawdzać czy w bieżącym katalogu istnieją pliki o nazwie ''log.0'',
''log.1'', ''log.2'', ''log.3'', …
\\
Przy pierwszej nazwie ''log.//i//'' która odnosi się do nieistniejącego
pliku pętla ma zostać przerwana. Następnie funkcja ma stworzyć pusty plik o
tak znalezionej nazwie i wypisać tę nazwę na standardowe wyjście.
**~~#~~.**
Podaj komendy powłoki które wypiszą wszystkie potęgi dwójki mniejsze niż wartość
zmiennej ''WINDOWID''.
\\
Wynik ma mieć następującą formę:
0 1
1 2
2 4
3 8
4 16
5 32
6 64
...
**~~#~~.**
Problem Collatza to pytanie czy ciąg liczb c₁, c₂, c₃, … konstruowany w
następujący sposób:
\\
cn+1 = (cn%2 == 0) ? cn/2 : 3*cn+1
\\
w skończonej liczbie kroków dotrze do elementu cᵢ == 1 dla dowolnej liczby
naturalnej c₁.
\\
Napisz komendy powłoki które podadzą kolejne liczby takiego ciągu rozpoczynając
od liczby 7.
\\
Oczekiwany wynik komend (''……'' zastępuje kilkanaście linii):
7
22
11
……
4
2
1
--------------------------
**~~#~~.**
Podaj linie które trzeba wpisać do skryptu żeby:
* stworzyć funkcję o nazwie ''interruptHandler'' która wypisze na standardowe wyjście tekst ''Interrupted!'' i jeżeli jest ustawiona zmienna ''TMPFILE'', to usunie plik wskazany wskazany przez tą zmienną,
* ustawić, żeby ta funkcja była wywoływana w konsekwencji naciśnięcia //Ctrl+c//.
**~~#~~.**
Komenda ''date +%s'' wypisuje //Unix time//, tzn. liczbę sekund które upłynęły
od 1 stycznia 1970r. Odjęcie dwóch wyników tej komendy obliczy czas w sekundach
między wywołaniami tych komend (z błędem do 1 sekundy).
\\
Podaj linie które trzeba wpisać __na początek__ skryptu, żeby na końcu działania
skryptu skrypt wyświetlił tekst ''Wykonanie skryptu trwało //N// sekund.'', gdzie
//N// ma być zastąpione faktyczną liczbą sekund.
--------------------------
**~~#~~.**
Napisz skrypt, który:
int main(int ac, char *av[]) {
if (ac < 3) return 1;
char *end;
int perms = strtol(av[1], &end, 8);
if (!av[1][0] || *end)
return 1;
for (int i = 2; i < ac; ++i) {
int fd = creat(av[i], perms);
close(fd);
}
return 0;
}
**~~#~~.** Wyjaśnij co robi poniższy kod. Podaj w jakim przypadku kod nie zadziała
w pełni poprawnie i zaproponuj co zmienić w kodzie by zawsze dział dobrze.
int main(int ac, char *av[]) {
if (ac != 2) return 1;
int fd = open(av[1], O_RDONLY);
if (fd == -1) return 1;
char buf[64];
lseek(fd, -64, SEEK_END);
read(fd, buf, 64);
write(1, buf, 64);
return 0;
}
**~~#~~.** Wyjaśnij co robi poniższy kod. Kod zawiera błąd – podaj jakiego rodzaju
problemy może spowodować ten błąd i zaproponuj co zmienić w kodzie by to
poprawić.
int addLogEntry(const char *cstr) {
int fd = open("log", O_WRONLY | O_APPEND);
if (fd == -1)
return -1;
char buf[256];
int len = sprintf(buf, "[%ld] %s\n", time(NULL), cstr);
int rv = write(fd, buf, len);
int e = errno;
close(fd);
errno = e;
return rv == -1 ? -1 : 0;
}
--------------------------
**~~#~~.**
W poniższym kodzie uzupełnij lukę wyrażeniami które w razie wstąpienia błędu
przy tworzeniu pliku wyświetlą nazwę pliku którego nie udało się stworzyć oraz
zrozumiałą dla człowieka przyczynę błędu:
int main(int ac, char *av[]) {
if (ac < 3) return 1;
char *end;
int perms = strtol(av[1], &end, 8);
if (!av[1][0] || *end)
return 1;
for (int i = 2; i < ac; ++i) {
int fd = creat(av[i], perms);
┌────────────────────────────┐
│ │
└────────────────────────────┘
close(fd);
}
return 0;
}
**~~#~~.**
Podaj (bądź uzupełnij lukę w innym przykładowym kodzie) jak
dowiedzieć się, że otwarcie pliku się nie powiodło z powodu braku uprawnień.
--------------------------
**~~#~~.**
Napisz program który wyświetli na ekranie całą zawartość pliku podanego jako
pierwszy argument, "szyfrując" w treści litery z zakresu ASCII szyfrem Cezara
(z przesunięciem o 3).
**~~#~~.**
Napisz program który dla każdego z podanych jako argumenty plików poda nazwę
pliku i ilość bajtów w najdłuższej linii (załóż, że linie są kończone przez
bajt ''%%'\n'%%''.
**~~#~~.**
Napisz program który jako argumenty przyjmuje dwie ścieżki do plików i wypisuje
na standardowe wyjście czy pliki są identyczne.
**~~#~~.**
Napisz program który jako argument przyjmuje: ścieżkę do pliku źródłowego,
zakres (dwie liczby) oraz ścieżkę do pliku docelowego
Program ma utworzyć nowy plik o podanej nazwie i zapisać w nim bajty z podanego
zakresu z pliku źródłowego.
\\
Przykład działania:
user@host:~ $ cat source Kids always brighten up a house; mostly by leaving the lights on. user@host:~ $ ./prog source 13 32 destination user@host:~ $ cat destination brighten up a house;**~~#~~.** Napisz program który usunie z pliku wskazanego jako argument wszystko poza pierwszą linią.