Home Dokumentacje Debian Reference (version 1) - Część 13 - Programowanie
14 | 12 | 2019
Debian Reference (version 1) - Część 13 - Programowanie Drukuj


[ powrót ] [ Spis treści ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ dalej ]


Debian Reference (version 1)
Część 13 - Programowanie


Pamiętaj, by nie używać nazwy „test” do oznaczania pliku wynikowego, ponieważ test jest wbudowanym poleceniem powłoki.


13.1 Gdzie zacząć?

Odnośniki:

Wiele długich dokumentów info można otrzymać w postaci wydrukowanej z GNU.

W następnych czterech rozdziałach znajdziesz przykładowe skrypty, każdy napisany w innym języku, które tworzą plik tekstowy zawierający informacje o koncie, które z kolei mogą być wstawione do pliku /etc/passwd za pomocą przetwarzania wsadowego np. programem newusers. Każdy ze skryptów oczekuje na wejściu pliku, którego linie są następującego formatu imię nazwisko hasło. (Katalogi domowe użytkowników nie będą tworzone przez te skrypty.)


13.2 Powłoka

Najlepszym sposobem na zrozumienie działania systemów uniksowych jest przeglądanie i czytanie skryptów powłoki. Poniżej podam pewne wskazówki i materiały przypominające programowanie w powłoce. Zobacz Pomyłki powłoki by uczyć się na błędach.


13.2.1 Bash – interaktywna powłoka zgodna z GNU

Odnośniki do informacji na temat Bash-a:

  • bash(1)

  • info bash

  • LDP BASH Programming - Introduction HOWTO (Programowanie w BASH-u - Wprowadzenie JTZ) - informacje dla początkujących

  • mc file:///usr/share/doc/bash/examples/ file:///usr/share/doc/bash/

    (Zainstaluj najpierw pakiet bash-doc, aby zobaczyć przykłady.)

  • Learning the bash Shell, 2nd edition (O'Reilly) - (Nauka powłoki bash - drugie wydanie)

Oto krótki, przykładowy program (tworzy on wpisy dt. kont na podstawie danych ze standardowego wejścia dla programu newusers):

     #!/bin/bash
     # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
     pid=1000;
     while read n1 n2 n3 ; do
     if [ ${n1:0:1} != "#" ]; then
     let pid=$pid+1
     echo ${n1}_${n2}:password:${pid}:${pid}:„,/home/${n1}_${n2}:/bin/bash
     fi
     done

13.2.2 Powłoki zgodne z POSIX

W systemie Debian powłoki zgodne z POSIX znajdują się w kilku pakietach:

  • dash (Sarge)

    • Priority: optional

    • Installed-Size: 176

    • Najmniejszy i jak dotąd najszybszy. – najlepszy dla początkowego rozruchu.

  • ash (Woody)

    • Priority: optional

    • Installed-Size: 180

    • Mniejszy i o wiele szybszy – dobry dla początkowego rozruchu.

  • bash

    • Essential: yes

    • Priority: required

    • Installed-Size: 580

    • Większy i z większymi możliwościami – napisanych zostało już wiele rozszerzeń.

  • pdksh

    • Priority: optional

    • Installed-Size: 408

    • Kompletny klon powłoki AT&T ksh.

Jeśli piszesz skrypty powłoki, które mają być przenoszone na inne powłoki/systemy to najlepiej pisać je jako skrypty powłoki POSIX. Użyj /bin/sh dowiązanego do ash lub (dash) aby sprawdzić zgodność z POSIX. Unikaj pisania skryptów z naleciałościami bashowymi lub zshsowymi, które przypominają składnię csh. Na przykład, staraj się unikać:

  • if [ foo == bar ] ; then ...

  • diff -u file.c{.orig,}

  • mkdir /foo{bar,baz}

Opisy powłoki w tym dokumencie dotyczą tylko powłok zgodnych ze strandardem POSIX, a więc nie dotyczą powłok typu csh, włączając tcsh.


13.2.3 Parametry powłoki

Kilka parametrów specjalnych do zapamiętania:

     $0      = nazwa powłoki lub skryptu
     $1      = pierwszy(1) argument powłoki
      ...
     $9      = dziewiąty(9) argument powłoki
     $#      = ilość parametrów pozycyjnych
     "$*"    = "$1 $2 $3 $4 ... $n"
     "$@"    = "$1" "$2" "$3" "$4" ... "$n"

     $?      = kod zakończenia ostatnio wykonywanego polecenia
     $$      = PID aktualnie wykonywanego skryptu powłoki
     $!      = PID ostatnio rozpoczętego zadania w tle

Podstawowe rozwinięcia parametrów (parameter expansion) do zapamiętania:

            Forma       Jeśli parametr    Jeśli parametr nie
                        jest ustawiony               jest ustawiony
     ${parametr:-słowo}   $parametr            słowo

     ${parametr:+słowo}   słowo                null
     ${parametr:=słowo}   $parametr            słowo

                                      (i wykonuje parametr=słowo)
     ${parametr:?słowo}   $parametr (wyświetla słowo i kończy działanie)

Dwukropek (`:') we wszystkich powyższych operatorach nie jest tak naprawdę potrzebny.

  • Z `:' = operator sprawdza czy zmienna „istnieje” i „nie jest pusta”.

  • Bez `:' = operator sprawdza tylko czy zmienna „istnieje”.

Podstawowe podstawienia parametrów(parameter substitutions) do zapamiętania:

         Forma                Wynik 
     ${parametr%końcówka}     Usunięcie najmniejszego wzorca końcówka
     ${parametr%%końcówka}    Usunięcie największego wzorca końcówka

     ${parametr#przedrostek}  Usunięcie najmniejszego wzorca przedrostek
     ${parametr##przedrostek} Usunięcie największego wzorca przedrostek

13.2.4 Przekierowywanie powłoki

Podstawowe operatory przekierowywania do zapamiętania ([n] jest opcjonalną liczbą określającą kwalifikator pliku):

     [n]> plik     Przekieruj standardowe wyjście (lub n) do pliku.
     [n]>> plik    Dołącz standardowe wyjście (lub n) do pliku.
     [n]< plik     Przekieruj standardowe wejście (lub n) z pliku.
     [n1]>&n2      Przekieruj standardowe wyjście (lub n1) do n2.
     > plik >&2    Przekieruj standardowe wyjście i strumień błędów do pliku.
     | polecenie     Przekieruj standardowe wyjście na wejście
     polecenia.
     >&2 | polecenie Przekieruj standardowe wyjście i strumień błędów
     na wejście polecenia.

Gdzie

  • standardowe wejście (stdin): kwalifikator pliku = 0)

  • standardowe wyjście (stdout): (kwalifikator pliku = 1)

  • standardowe wyjście błędu (stderr): (kwalifikator pliku = 2)

Powłoka umożliwia otwarcie plików przez użycie wbudowanego polecenia exec i bezwzględnego kwalifikatora pliku.

       	 $ echo Witaj >pliczek
       	 $ exec 3<pliczek 4>pliczek2  # otwieranie plików
       	 $ cat <&3 >&4        # przekierowanie stdin do 3, a stdout do 4
       	 $ exec 3<&- 4>&-     # zamykanie plików
       	 $ cat pliczek2
       	 Witaj

Powyżej n<&- oraz n>&- oznacza zamknięcie kwalifikatora pliku o numerze n.


13.2.5 Polecenia warunkowe powłoki

Każde polecenie zwraca kod wyjścia (exit status), który może zostać użyty w wyrażeniu warunkowym:

  • Sukces: 0 (Prawda)

  • Błąd: 1–255 (Fałsz)

Zauważ, że użycie wartości 0 w celu wyrażenia „prawdy” różni się od zwykłej konwencji w innych obszarach przetwarzania. Poza tym `[' jest odpowiednikiem polecenia test, które traktuje argumenty aż do `]' jako wyrażenie warunkowe.

Podstawowe idiomy warunkowe (conditional idioms) do zapamiętania to:

     polecenie && jeśli_sukces_uruchom_również_to_polecenie || true
     polecenie || jeśli_nie_sukces_uruchom_w_zamian_to_polecenie
     
     if [ wyrażenie_warunkowe ]; then  
      jeśli_sukces_uruchom_to_polecenie

     else
      jeśli_nie_sukces_uruchom_to_polecenie
     fi

|| true było potrzebne by upewnić się, że ten skrypt przypadkowo nie zakończy się w tej linii jeśli powłoka byłaby wywołana z flagą -e.

Operatory porównywania plików w wyrażeniach warunkowych to:

     -e plik         Prawda, jeśli plik istnieje.
     -d plik         Prawda, jeśli plik istnieje i jest katalogiem.
     -f plik         Prawda, jeśli plik istnieje i jest normalnym plikiem.
     -w plik         Prawda, jeśli plik istnieje i jest zapisywalny.
     -x plik         Prawda, jeśli plik istnieje i jest wykonywalny.
     plik1 -nt plik2 Prawda, jeśli plik1 jest nowszy niż plik2. (modyfikacja)
     plik1 -ot plik2 Prawda, jeśli plik1 jest starszy niż plik2. (modyfikacja)
     plik1 -ef plik2 Prawda, jeśli mają takie same numery urządzeń i iwęzłów.

Operatory porównywania łańcuchów znaków w wyrażeniach warunkowych:

          -z słowo    Prawda, jeśli długość słowo wynosi zero.
          -n słowo    Prawda, jeśli długość słowo jest różna od zera.
     słowo1 == słowo2   Prawda, jeśli słowa są równe.
     słowo1 = słowo2    Prawda, jeśli słowa są równe.
         (dla ścisłej zgodności z POSIX, zamiast „==” należy używać „=”) 
     słowo1 != słowo2   Prawda, jeśli słowa nie są równe.
     słowo1 <  słowo2   Prawda, jeśli słowo1 sortuje się przed słowo2 (zleżne od lokalizacji (locale)).
     słowo1 >  słowo2   Prawda, jeśli słowo1

     sortuje się po słowo2 (zależne od lokalizacji (locale) ).

Operatory arytmetycznego porównywania liczb całkowitych

Wyrażenia warunkowe to: -eq, -ne, -lt, -le, -gt, i -ge.


13.2.6 Przetwarzanie linii poleceń

Powłoka przetwarza skrypt tak:

  • rozbicie na żetony (tokens) przez meta-znaki: SPACJA, TAB, NOWA_LINIA, ;, (, ), <, >, |, &

  • sprawdzenie słów kluczowych (keyword), jeśli nie są pomiędzy "..." lub '...' (pętla)

  • rozwinięcie aliasów, jeśli nie są pomiędzy "..." lub '...' (pętla)

  • rozwinięcie nawiasów, a{1,2} -> a1 a2, jeśli nie są pomiędzy "..." lub '...'

  • rozwinięcie tyld, ~użytkownik -> katalog domowy użytkownika, jeśli nie jest pomiędzy "..." lub '...'

  • rozwinięcie parametrów, $PARAMETRÓW, jeśli nie są pomiędzy "..."

  • rozwinięcie podstawienia polecenia, $(polecenie), jeśli nie jest pomiędzy '...'

  • podział na słowa wg. $IFS, jeśli nie są pomiędzy "..." lub '...'

  • rozszerzenie *?[] na ścieżki, jeśli nie jest pomiędzy "..." lub '...'

  • znalezienie polecenia

    • funkcji

    • wbudowanego

    • pliku w $PATH

  • pętla

Pojedyncze cudzysłowy pomiędzy podwójnymi cudzysłowami nie dają żadnego efektu.

Wykonanie set -x w powłoce lub też wywołanie powłoki z opcją -x zmusza powłokę do wypisywania wszystkich poleceń, jakie wykonuje. Może to być pomocne przy odpluskwianiu.


13.3 Awk

Miejsca, w których można znaleźć informacje o Awk:

  • Effective awk Programming, 3rd edition (O'Reilly) - (Efektywne programowanie w awk, trzecie wydanie)

  • Sed & awk, 2nd edition (O'Reilly) - (Sed i awk, drugie wydanie)

  • mawk(1) i gawk(1)

  • info gawk

Krótki przykład programu (tworzącego wpisy dla newusers):

     #!/usr/bin/awk -f
     # Skrypt tworzący plik przystosowany do użycia z poleceniem 'newusers'
     # z pliku zawierającego ID użytkowników i hasła w formie:
     # Imię Nazwisko hasło
     # Copyright (c) KMSelf Sat Aug 25 20:47:38 PDT 2001
     # Distributed under GNU GPL v 2, or at your option, any later version.
     # This program is distributed WITHOUT ANY WARRANTY.
     
     BEGIN {
         # Przydzielenie początkowych UID i GID
         if ( ARGC > 2 ) {
             startuid = ARGV[1]
             delete ARGV[1]
         }
         else {
             printf( "Wywołanie: newusers PoczatkoweUID plik\n" \
               "  gdzie:\n"

               "    PoczątkoweUID jest początkowym identyfikatorem dodawanego użytkownika,\n" \
               "    plik jest plikiem wejścia w postaci:\n" \
               "      imię nazwisko hasło\n" \
             )
             exit
         }
     
         infile = ARGV[1]
         printf( "Początkowe UID: %s\n\n", startuid )
     }
     
     /^#/ { next }
     
     {
         ++record
         first = $1
         last = $2
         passwd = $3
         user= substr( tolower( first ), 1, 1 ) tolower( last )
         uid = startuid + record - 1
         gid = uid
         printf( "%s:%s:%d:%d:%s %s„/home/%s:/bin/bash\n",  \
             user, passwd, uid, gid, first, last, user \
             )
     }

Dwa pakiety w systemie Debian dostarczają awk zgodnego z POSIX:

  • mawk

    • Priority: required

    • Installed-Size: 228

    • Mniejszy i znacznie szybszy – dobry dla domyślnej instalacji

    • Zawiera ograniczenia ustalane podczas kompilacji

      • NF = 32767

      • sprintf buffer = 1020

  • gawk

    • Priority: optional

    • Installed-Size: 1708

    • Większy i potężniejszy – posiada wiele rozszerzeń

      • System V Release 4 version of UNIX

      • Bell Labs awk

      • GNU-specific


13.4 Perl

To jest prawdziwy interpreter w systemach uniksowych.

Miejsca, w których można znaleźć informacje o Perl'u:

  • perl(1)

  • Programming Perl, 3rd edition (O'Reilly)

Krótki, przykładowy program (tworzy wpisy dla polecenia newusers):

     #!/usr/bin/perl
     # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
     $pid=1000;
     while (<STDIN>) {
             if (/^#/) { next;}
             chop;
             $pid++;
             ($n1, $n2, $n3) = split / /;
             print $n1,"_",$n2,":", $n3, ":",$pid,
                       ":",$pid,"„,/home/",$n1,"_",$n2,":/bin/bash\n"

     }

Instalacja modułu Perla nazwa_modułu:

     # perl -MCPAN -e 'install nazwa_modułu'

13.5 Python

Jest to miły, zorientowany obiektowo interpreter.

Miejsca, w których można znaleźć informacje o Pythonie:

  • python(1)

  • Learning Python (O'Reilly).

Krótki, przykładowy program (tworzy wpisy dla polecenia newusers):

     #! /usr/bin/env python
     import sys, string
     
     # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
     # Ported from awk script by KMSelf Sat Aug 25 20:47:38 PDT 2001
     # This program is distributed WITHOUT ANY WARRANTY.
     
     def usages():
         print \
     "Sposób użycia:  ", sys.argv[0], " PoczątkoweUID [plik]\n" \
     "\tPoczątkoweUID jest początkowym identyfikatorem dodawanego użytkownika.\n" \
     "\tplik jest plikiem wejścia. Jeśli nie określony to standardowe wejście.\n\n" \
     "Format pliku wejściowego:\n"\
     "\timię nazwisko hasło\n"

                     return 1
     
     def parsefile(startuid):
         #
         # główne filtrowanie
         #
         uid = startuid
         while 1:
             line = infile.readline()
             if not line:
                 break
             if line[0] == '#':
                 continue
             (first, last, passwd) = string.split(string.lower(line))
             # powyższe rozsypuje się przy złej liczbie parametrów :-)
             user = first[0] + last
             gid = uid
             lineout = "%s:%s:%d:%d:%s %s„/home/%s:/bin/bash\n" %  \
                 (user, passwd, uid, gid, first, last, user)
             sys.stdout.write(lineout)
             +uid
     
     if __name__ == '__main__':
         if len(sys.argv) == 1:
             usages()
         else:
             uid = int(sys.argv[1])
             #print "# UID zaczyna się od: %d\n" % uid
             if len(sys.argv) > 1:
                 infilename   = string.join(sys.argv[2:])
                 infile = open(infilename, 'r')
                 #print "# Czytaj plik z: %s\n\n" % infilename
             else:
                 infile = sys.stdin
             parsefile(uid)

13.6 Make

Miejsca, w których można znaleźć informacje o Make:

  • info make

  • make(1)

  • Managing Projects with make, 2nd edition (O'Reilly)

Proste zmienne automatyczne:

Składnia reguł:

     Cel: [ warunek wstępny ... ]
      [TAB]  polecenie1
      [TAB]  -polecenie2 # ignoruj błędy
      [TAB]  @polecenie3 # wstrzymaj echo

Gdzie [TAB] jest kodem TAB. Każda linia jest intrepretowana przez powłokę po podmianie zmiennych przez make. Użyj \ na końcu linii, by kontynuować skrypt. Użyj $$, by wprowadzić $ dla zmiennych środowiskowych w skrypcie powłoki.

Uwikłane reguły dla celu oraz warunki wstępne mogą być, na przykład, zapisane jako:

     %: %.c header.h

lub

     %.o: %.c header.h

Tutaj cel zawiera znak % (dokładnie jeden z nich). Znak % może zastępować jakikolwiek niepusty podciąg aktualnych nazw plików danego celu. W warunkach wstępnych również można użyć znaku % by pokazać jak ich nazwy mają się do aktualnej nazwy celu.

Reguły przyrostkoweprzestarzałym sposobem definiowania reguł uwikłanych dla make. Są nadal obsługiwane w GNU make dla zgodności, ale używaj odpowiednich reguł wzorców, kiedykolwiek to możliwe:

     stara reguła przyrostkowa --> nowa reguła wzorcowa
     .c:                       --> %  : %.c
     .c.o:                     --> %.o: %.c

Automatyczne zmienne dla reguł:

     foo.o: new1.c new2.c old1.c new3.c
     $@ == foo.o                         (cel)
     $< == new1.c                        (pierwszy)
     $? == new1.c new2.c new3.c          (nowsze)
     $^ == new1.c new2.c old1.c new3.c   (wszystkie)
     $* == `%' dopasowany rdzeń we wzorcu celu

Opis zmiennych:

     foo1 := bar    # Jednorazowe rozszerzenie
     foo2  = bar    # Rekursywne rozszerzenie
     foo3 += bar    # Dopisanie
     SRCS := $(wildcard *.c)
     OBJS := $(foo:c=o)
     OBJS := $(foo:%.c=%.o) 
     OBJS := $(patsubst %.c,%.o,$(foo)) 
     DIRS  = $(dir katalog/plik.rozszerzenie) # Wydobywa „katalog”
     $(notdir NAZWY...), $(basename NAZWY...), $(suffix NAZWY...) ...

Wprowadź make -p -f/dev/null, by zobaczyć automatyczne reguły wewnętrzne.


13.7 C

Przygotowanie:

     # apt-get install glibc-doc manpages-dev libc6-dev gcc

Miejsca, w których można znaleźć informacje o C:

  • info libc (opis funkcji biblioteki C)

  • gcc(1)

  • each_C_library_function_name(3)

  • Kernighan & Ritchie, The C Programming Language, 2nd edition (Prentice Hall).


13.7.1 Prosty program w C (gcc)

Prosty przykład kompilowania przyklad.c z biblioteką libm do pliku wykonywalnego uruchom_przyklad:

     $ cat > przyklad.c << EOF
     #include <stdio.h>

     #include <math.h>
     #include <string.h>
     
     int main(int argc, char **argv, char **envp){
             double x;
             char y[11];
             x=sqrt(argc+7.5);
             strncpy(y, argv[0], 10); /* zapobiega przepełnieniu bufora */
             y[10] = '\0'; /* wypełniamy, by upewnić się, że ciąg kończy się '\0' */
             printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
             return 0;
     }
     EOF
     $ gcc -Wall -g -o uruchom_przyklad przyklad.c -lm
     $ ./uruchom_przyklad
             1, 2.915, ./uruchom_,     (null)
     $ ./uruchom_przyklad 1234567890qwerty
             2, 3.082, ./uruchom_, 1234567890qwerty

W przykładzie -lm jest potrzebne, by zlinkować bibliotekę libm dla sqrt(). Faktycznie biblioteka znajduje się w /lib pod nazwą libm.so.6, która jest dowiązaniem symbolicznym do libm-2.1.3.so.

Spójrz na ostatni parametr w wyjściowym tekście. Jest tam więcej niż dziesięć znaków mimo, że użyliśmy %10s.

Używanie funkcji ze wskaźnikami do operacji na pamięci bez sprawdzania obszarów granicznych, zwłaszcza takich jak sprintf lub strcpy, jest uznawane za przestarzałe, co ma zapobiegać błędom przepełnienia buforu. Zamiast nich należy używać sprintf oraz strncpy.


13.7.2 Odpluskwianie


13.7.2.1 Uruchamianie i testowanie programów przy pomocy gdb

Przygotowanie:

     # apt-get install gdb

Miejsca, w których można znaleźć informacje o gdb:

Do prześledzenia działania programu skompilowanego z opcją -g użyj programu gdb. Wiele poleceń ma swoje kilkuznakowe skróty. Dopełnianie tabulatorem działa tak samo jak w powłoce.

     $ gdb program
     (gdb) b 1                # ustaw punkt wstrzymania w linii 1
     (gdb) run arg1 arg2 arg3 # uruchom program
     (gdb) next               # następna linia
     ...
     (gdb) step               # krok do przodu
     ...
     (gdb) p parm             # wyświetl parm 
     ...
     (gdb) p parm=12          # ustaw wartość na 12

Jeśli chcesz się dowiedzieć, jak przeprowadzić odpluskwianie przy pomocy Emacsa, zerknij do Podsumowanie poleceń edytorów (Emacs, Vim), Rozdział 11.3.4.


13.7.2.2 Sprawdzanie zależności od bibliotek

Aby znaleźć wymagane przez program biblioteki skorzystaj z ldd:

     $ ldd /bin/ls
             librt.so.1 => /lib/librt.so.1 (0x4001e000)
             libc.so.6 => /lib/libc.so.6 (0x40030000)
             libpthread.so.0 => /lib/libpthread.so.0 (0x40153000)
             /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

By ls mogło pracować w środowisku chroot, muszą się w nim znaleźć powyższe biblioteki.

Następujące polecenia mogą być również użyteczne:

  • strace: śledzi wywołania systemowe oraz sygnały

  • ltrace: śledzi wywołania biblioteczne


13.7.2.3 Odpluskwianie z użyciem narzędzi do wykrywania wycieków pamięci

Istnieje wiele narzędzi do wykrywania wycieków pamięci w Debianie:

  • njamd

  • valgrind

  • dmalloc

  • electric-fence

  • memprof

  • memwatch (niedostępny w pakiecie, pobierz z memwatch.)

  • mpatrol

  • leaktracer

  • libgc6

  • Insure++ z Parasoft. (non-free, komercyjnie za opłatą)

Sprawdź również Debugging Tools for Dynamic Storage Allocation and Memory Management.


13.7.3 Flex – lepszy Lex

flex jest szybkim generatorem analizatorów leksykalnych.

Miejsca, w których można znaleźć informacje o flex:

  • info flex (samouczek)

  • flex(1)

Musisz utworzyć własną funkcję main() i yywrap(), lub program.l powinien wyglądać tak, jak poniżej, by kompilował się bez biblioteki (yywrap jest makrem; %option main uaktywnia bezwarunkowo %option noyywrap):

     %option main
     %%
     .|\n    ECHO ;
     %%

Zamiast tego możesz skompilować program podając na końcu polecenia cc opcję -lfl (tak jak przy AT&T-Lex opcję -ll). Nie potrzeba wtedy używać %option.


13.7.4 Bison – lepszy Yacc

Kilka pakietów w Debianie dostarcza zgodny z Yacc generator analizatorów składniowych:

  • bison: GNU LALR parser generator

  • byacc: The Berkeley LALR parser generator

  • btyacc: Backtracking parser generator oparty na byacc

Miejsca, w których można znaleźć informacje o bison:

  • info bison (samouczek)

  • bison(1)

Musisz utworzyć własne funkcje main() i yyerror(). main() wywołuje yyparse(), która z kolei wywołuje yylex(), zazwyczaj stworzoną przez FleX.

     %%
     
     %%

13.7.5 Autoconf

autoconf jest narzędziem tworzącym skrypty powłoki, które automatycznie konfigurują źródła oprogramowania, by dostosować je do wielu systemów uniksopodobnych, używając systemu budowania GNU.

autoconf tworzy skrypt konfigurujący configure, a configure automatycznie dostosowany Makefile używając wzorca Makefile.in.


13.7.5.1 Kompilacja i instalacja programu

Debian nie dotyka plików znajdujących się w /usr/local (zobacz Wsparcie dla różnorodności, Rozdział 2.5). W związku z tym, jeśli skompilujesz program ze źródeł oraz zainstalujesz go w /usr/local nie będzie on kolidował z Debianem.

     $ cd src
     $ ./configure --prefix=/usr/local
     $ make
     $ make install # to polecenie przekopiuje pliki do systemu

13.7.5.2 Odinstalowywanie programu

Jeśli nadal posiadasz źródła i używają one autoconf/automake oraz pamiętasz parametry z jakimi je konfigurowałeś spróbuj:

     $ ./configure wszelkie-opcje-jakie-podałeś-przy-konfiguracji
     # make uninstall

Zamiast tego, jeśli jesteś absolutnie pewien, że podczas instalacji pliki kopiowane są tylko do /usr/local i nie ma tam niczego ważnego, możesz usunąć jego zawartość wprowadzając:

     # find /usr/local -type f -print0 | xargs -0 rm -f

Jeśli natomiast nie jesteś pewien gdzie zostały przekopiowane pliki podczas instalacji, rozważ zastosowanie checkinstall, który pozwala w łatwy sposób odinstalować programy.


13.8 Przygotowanie dokumentu


13.8.1 Skład tekstu roff

Tradycyjnie już, roff jest głównym systemem procesu tekstu w systemach Unix.

Zobacz roff(7), groff(7), groff(1), grotty(1), troff(1), groff_mdoc(7), groff_man(7), groff_ms(7), groff_me(7), groff_mm(7) oraz info groff.

Istnieje dobre wprowadzenie do makr -me. Jeśli posiadasz groff (w wersji 1.18 lub nowszej), znajdź file:///usr/share/doc/groff/meintro.me.gz i wprowadź poniższe polecenie:

     $ zcat file:///usr/share/doc/groff/meintro.me.gz | \
          groff -Tascii -me - | less -R

Kolejne polecenie utworzy zwykły plik tekstowy:

     $ zcat file:///usr/share/doc/groff/meintro.me.gz | \
         GROFF_NO_SGR=1 groff -Tascii -me - | col -b -x > meintro.txt

Dla drukowania skorzystaj z wyjścia PostScript.

     $ groff -Tps meintro.txt | lpr
     $ groff -Tps meintro.txt | mpage -2 | lpr

13.8.2 SGML

Przygotowanie:

     # apt-get install debiandoc-sgml debiandoc-sgml-doc

Miejsca, w których można znaleźć informacje o debiandoc-sgml:

  • file:///usr/share/doc/debiandoc-sgml-doc

  • debiandoc-sgml(1)

  • DocBook: The Definitive Guide, by Walsh and Muellner, (O'Reilly) (pakiet docbook-defguide)

SGML umożliwia zarządzanie wieloma formatami dokumentu. Jednym z prostszych systemów SGML jest Debiandoc, który jest tutaj używany. Wymaga on pewnych konwersji plików tekstowych dla następujących znaków:

  • „<” --> &lt;

  • „>” --> &gt;

  • „ ” --> &nbsp; (niełamana spacja)

  • „&” --> &amp;

  • „%” --> &percnt;

  • „©” --> &copy;

  • „–” --> &ndash;

  • „—” --> &mdash;

W celu oznaczenia części jako niedrukowalny komentarz wprowadź:

     <!-- A tu jest właśnie komentarz ... -->

Do oznaczenia miejsca, z którym mamy problemy (brak wiedzy, doświadczenia z danego zakresu) użyj poniższej formy:

     <![ %FIXME; [ Nie wiem, co tu powinno być ... ]]>

W SGMLu pierwsza definicja entitki wygrywa. Przykład:

     <!entity % qref "INCLUDE">
     <![ %qref; [ <!entity param "Data 1"> ]]>

     <!entity param "Data 2">
     &param;

W dokumencie wynikowym będzie "Data 1". Jeśli w pierwszej linii byłoby "IGNORE" zamiast "INCLUDE", pojawiłoby się "Data 2" (druga linia jest wyrażeniem warunkowym). Również powtórzone zwroty, wyrażenia mogą być z góry oddzielone od kontekstu.

     <!entity czyjtojest "mój">
     Witaj  &czyjtojest; przyjacielu.
     To jest &czyjtojest; podręcznik.

Efektem będzie:

     Witaj mój przyjacielu.
     To jest mój podręcznik.

Przyjrzyj się prostemu przykładowi SGML sample.sgml, znajdującego się w examples.

Niekiedy, gdy dokument SGML rozrasta się, TeX (używany jako silnik do przetwarzania tekstu) może zacząć generować błędy. Więcej informacji tutaj: TeX/LaTeX, Rozdział 13.8.3.


13.8.3 TeX/LaTeX

Przygotowanie:

     	 # tasksel # select Miscellaneous  --> TeX/LaTeX environment

Odsyłacze poświęcone LaTeXowi:

  • The teTeX HOWTO: The Linux-teTeX Local Guide

  • tex(1)

  • latex(1)

  • The TeXbook, by Donald E. Knuth, (Addison-Wesley) [58]

  • LaTeX - A Document Preparation System, by Leslie Lamport, (Addison-Wesley)

  • The LaTeX Companion, by Goossens, Mittelbach, Samarin, (Addison-Wesley)

TeX to najpotężniejsze środowisko składu dokumentów. Wiele procesorów SGML używa go do przetwarzania tekstu. Lyx dostarczany w pakietach lyx, lyx-xforms oraz lyx-qt oferuje przyjemne środowisko WYSIWYG dla LaTeXa, jednakże wiele osób wybiera Emacsa lub Vima do tworzenia źródeł (La)TeXowych.

Istnieje wiele dokumentacji i zasobów dostępnych w Sieci:

Gdy dokument rozrasta się, TeX może zacząć generować błędy. Żeby uporać się z tym problemem, musisz zwiększyć parametr pool size w /etc/texmf/texmf.cnf (lub, co bardziej zalecane, zmodyfikować /etc/texmf/texfm.d/95NonPath i uruchomić update-texmf).


13.8.4 Literat-programista

Zamiast pisania kodu zawierającego dokumentację, literat-programista pisze dokumentację zawierajacą kod. To zapewnia dobrą dokumentację dla programu.

Więcej na ten temat znajduje się tutaj: Literackie programowanie.


13.8.4.1 Noweb

Przygotowanie:

     	# apt-get install nowebm

Odsyłacze na temat Noweb:

Jest to narzędzie w stylu WEB, które jest prostsze oraz zapewnia rozszerzalność i niezależność od języka. [59] Kiedy noweb zostanie użyty, wypisuje źródło programu do plików wyjściowych wskazanych w pliku noweb oraz tworzy pliki w formacie TeX składające się na dokumentację.

Pakiet ifupdown to świetny przykład.

       	 $ apt-get source ifupdown
       	 $ cd ifupdown*
       	 $ make ifupdown.pdf ifupdown.ps

13.8.4.2 Doxygen

Przygotowanie:

       	 # apt-get install doxygen doxygen-doc doxygen-gui

Odsyłacze na temat Doxygen (tworzone przez doxygen!):

Narzędzie potrafi tworzyć pliki HTML, RTF, podręcznika systemowego Unix, PostScript oraz PDF (z użyciem LaTeXa) stanowiące dokumentację do C++, C, Jawy, IDL oraz w pewnej mierze programów PHP i C#. Doxygen jest zgodny z JavaDoc (1.1), Qt-Doc oraz KDOC i został zaprojektowany specjalnie dla projektów wykorzystujących firmowane przez Troll Techa Qtrozwiązania. Program tworzy drzewo zależności, diagramy współpracy oraz graficzną hierarchię klas (nawet dla nieudokumentowanych programów). W efekcie powstaje dokumentacja podobna do dostarczanej z bibliotekami Qt.


13.9 Pakietowanie

Przygotowanie:

     # apt-get install debian-policy developers-reference \
                       maint-guide dh-make debhelper
     # apt-get install packaging-manual # dla Potato

Miejsca, w których można znaleźć informacje o pakietowaniu:


13.9.1 Pakietowanie pojedyńczego pliku binarnego

Szybka i brzydka metoda pakietowania podesłana przez Joey Hessa.

     # mkdir -p mypkg/usr/bin mypkg/DEBIAN
     # cp binary mypkg/usr/bin
     # cat > mypkg/DEBIAN/control
     Package: mojpakiet
     Version: 1
     Architecture: i386
     Maintainer: Joey Hess <
 Adres poczty elektronicznej jest chroniony przed robotami spamującymi. W przeglądarce musi być włączona obsługa JavaScript, żeby go zobaczyć.
 >

     Description: mój mały pakiecik
      Nie spodziewaj się zbyt wiele.
     ^D
     # dpkg-deb -b mypkg

13.9.2 Pakietowanie z użyciem narzędzi

W celu utworzenia podstawowego pakietu możesz skorzystać z dh_make dostępnego w pakiecie dh-make. Następnie postępuj według instrukcji z dh-make(1). Ten sposób wykorzystuje debhelper w debian/rules.

Starszym sposobem jest użycie deb-make z pakietu debmake. Wtedy korzysta się jedynie z powłoki, zamiast z debhelper.

Przykładem wieloźródłowego pakietu może być „mc” (dpkg-source -x mc_4.5.54.dsc), korzystający z „sys-build.mk” Adama Heatha ( Adres poczty elektronicznej jest chroniony przed robotami spamującymi. W przeglądarce musi być włączona obsługa JavaScript, żeby go zobaczyć. ), oraz „glibc” (dpkg-source -x glibc_2.2.4-1.dsc), który korzysta z innego systemu Joela Kleckera ( Adres poczty elektronicznej jest chroniony przed robotami spamującymi. W przeglądarce musi być włączona obsługa JavaScript, żeby go zobaczyć. ).


[ powrót ] [ Spis treści ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ dalej ]


Debian Reference (version 1)

This translation is based on old version of Debian Reference (English, version 1.x), well before Sat, 26 Jan 2008.

Osamu Aoki osamu#at#debian.org
Koordynator tłumaczenia: Bartosz Feński aka fEnIo Adres poczty elektronicznej jest chroniony przed robotami spamującymi. W przeglądarce musi być włączona obsługa JavaScript, żeby go zobaczyć.
Autorzy, Rozdział A.1


 
Linki sponsorowane

W celu realizacji usług i funkcji na witrynach internetowych ZUI "ELPRO" stosujemy pliki cookies. Korzystanie z witryny bez zmiany ustawień dotyczących plików cookies oznacza, że będą one zapisywane w urządzeniu wyświetlającym stronę internetową. Więcej szczegółów w Polityce plików cookies.

Akceptuję pliki cookies z tej witryny.