[ powrót ] [ Spis treści ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ dalej ]
Pamiętaj, by nie używać nazwy „test” do oznaczania pliku
wynikowego, ponieważ test
jest wbudowanym poleceniem powłoki.
Odnośniki:
Dokumentacja i przykłady w katalogu
/usr/share/doc/pakiet
Linux Programming Bible (John Goerzen/IDG books)
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.)
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.
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 /usr/share/doc/bash/examples/ /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
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
.
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
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.
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.
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.
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
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'
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)
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 przyrostkowe są przestarzał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.
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).
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
.
gdb
Przygotowanie:
# apt-get install gdb
Miejsca, w których można znaleźć informacje o gdb
:
info gdb (samouczek)
gdb(1)
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.
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
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
.
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.
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.
%% %%
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
.
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
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.
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ź
/usr/share/doc/groff/meintro.me.gz
i wprowadź poniższe polecenie:
$ zcat /usr/share/doc/groff/meintro.me.gz | \ groff -Tascii -me - | less -R
Kolejne polecenie utworzy zwykły plik tekstowy:
$ zcat /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
Przygotowanie:
# apt-get install debiandoc-sgml debiandoc-sgml-doc
Miejsca, w których można znaleźć informacje o debiandoc-sgml
:
/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:
„<” --> <
„>” --> >
„ ” --> (niełamana spacja)
„&” --> &
„%” --> %
„©” --> ©
„–” --> –
„—” --> —
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"> ¶m;
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.
Przygotowanie:
# tasksel # select Miscellaneous --> TeX/LaTeX environment
Odsyłacze poświęcone LaTeXowi:
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:
teTeX - A Documentation
Guide
(tetex-doc
package)
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
).
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
.
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
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 Qt
rozwią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.
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:
System zarządzania pakietami w Debianie, Rozdział 2.2 (podstawy)
Debian New Maintainers' Guide (samouczek)
dh-make(1)
Debian Developer's Reference (najlepsza praktyka)
Debian Policy Manual (autorytatywny)
Packaging Manual (Potato)
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 <joeyh@debian.org> Description: mój mały pakiecik Nie spodziewaj się zbyt wiele. ^D # dpkg-deb -b mypkg
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 (doogie@debian.org
), oraz
„glibc” (dpkg-source -x glibc_2.2.4-1.dsc),
który korzysta z innego systemu Joela Kleckera (espy@debian.org
).
[ powrót ] [ Spis treści ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ dalej ]
Debian Reference
CVS, czwartek, 18 styczeń 2007, 11:53:26 UTCosamu#at#debian.org
fenio@o2.pl