[BSD] Amatőr FreeBSD kérdések

Zahemszky Gábor Gabor at Zahemszky.HU
2006. Május. 16., K, 09:51:53 CEST


Szia!

> Zahemszky Gábor ezt írta:
>> # sh /usr/local/etc/rc.d/akarmi start
> 
>   Van valami különleges ok arra, hogy ezt az sh indítsa el? Mert én 
> simán így szoktam:
> # /usr/local/etc/rc.d/akarmi start

Kevés. Sorolom őket.

a) megszokás (*)
b) ekkor nem kell a futtatás jog a szkriptre (és míg mondjuk FreeBSD-ben
 nem találtam nem-futtatható rc-szkriptet, használok pár nem-free
rendszert, ahol van olyan is, hogy non-exec némelyik szkript)
c) így is, úgy is ez a parancs fog lefutni (legalábbis feltételezve,
hogy az rc-szkript az elvárható #!/bin/sh -val kezdődik)

Természetesen a Te módszerednek is van előnye: így akár
perl/python/sed/od/stb szkriptet is lehet odatenni futtatónak. Viszont
itt utalnék arra, hogy nem sokkal ezelőttig a $local_startup -beli
szkripteket csak akkor futtatta le a FreeBSD rc-indítója, ha akarmi.sh
volt a nevük - és lássuk be, ez finom utalás arra, hogy tessen sh-ban
megírni ezeket, ne másban.

Zahy < Gabor at Zahmeszky dot HU >

(*) Egy kis történelem, aminek nem tudom mennyire van FreeBSD-n jelenleg
létjogosultsága. Eredendően a UNIX kernel, ha egy ismeretlen magic(5) -ű
futtathatót indított valaki, akkor az exec rendszerhívásban az eredeti
parancs param1 param2
helyett  futtatta a
/bin/sh parancs param1 param2
parancsot. Ez egész addig jó volt, amíg nem jelent meg a BSD-kben a
C-shell, amely a history mechanizmusa miatt egyes körökben nagyon
elterjedt. (Ebben az időben _gyakorlatilag_ nem volt olyan
parancsértelmező, amely ilyen kurzor-fel-le - vagy akár Ctrl-P/Ctrl-N
formában lehetővé tette volna a korábbi parancsok gyors
elérését/szerkesztését.) Tehát sokan interaktív shellként azt
kezdték/tük használni. A csh szintaxisa ismerten elég rendesen eltér a
Bourne-shell szintaxisától. Eredmény: interaktívan csh-beli szintaxissal
írta az ember a szkripteket (bár csh-ban szkriptelni - szerintem -
borzalom), de ha már fájlba tette, válthatott az sh-szintaxisra. (Vagy
pedig futtatta:
csh parancs param1 param2
formában.) Ez elég irritáló volt, ezért a csh-ba (nem a kernelbe!)
beleépítették azt, hogy ha valamilyen parancsot futtatott az illető,
akkor a kernelbeli exec előtt, maga a csh megvizsgálta a "binárist", és
ha azt látta, hogy a legelső bájt #, akkor maga a C-shell már
csh parancs param1 param2
formában indította el. Zseniális húzás, kivéve, hogy normálisabb
helyeken elő van írva, hogy a program jól dokumentált legyen, tehát a
szkriptek jelentős része néhány sornyi megjegyzéssel kezdődik, valahogy így:

# Copyright Zahy (C)
# 2006. 05. 16.
# This program does this little ....
# You have to call it with ...
és í. t.

Eredménye: aki Bourne-shell-t használ, annak ezt a szkriptet a rendszer
/bin/sh -val fogja futtatni, aki pedig C-shellben dolgozik, annak
/bin/csh futtatja ugyanazt. (Márpedig primitív parancsokon túl elég
nehéz mind a kettőben jól működő szkriptet írni.) Ennek további
folyománya volt, hogy az sh-szkriptek így néztek ki:

:
# Do not delete that line above this one!
# That line needs for correct running under C-shell.
# Copyright Zahy (C)
# 2006. 05. 16.
# This program does this little ....
# You have to call it with ...
és í. t.

Azaz, egy : (ismertebb nevén "true") paranccsal kezdődött a szkript. Így
- mivel nem # az első bájt, a csh nem akarta maga értelmezni a dolgokat,
tehát odaadta szépen a kernelnek, az exec pedig régi jó bevált szerepe
szerint /bin/sh -val futtatta.

Ezt a hajmeresztő állapotot szüntette meg a kernelbeli exec-be
beleépített she-bang (#!) értelmezés.

No és mivel én dolgoztam ilyen rendszeren (először sh-ban, majd csh-ban
- következésképpen belefutottam a fenti őrületbe), én hozzászoktam, hogy
nem szívatom magam, hanem sh akarmi formában futtatom a dolgokat.

-- 
#!/bin/ksh
Z='21N16I25C25E30, 40M30E33E25T15U!';IFS=' ABCDEFGHIJKLMNOPQRSTUVWXYZ
';set -- $Z;for i;{ [[ $i = ? ]]&&print $i&&break;[[ $i = ???
]]&&j=$i&&i=${i%?};typeset -i40 i=8#$i;print -n ${i#???};[[ "$j" = ???
]]&&print -n "${j#??} "&&j=;typeset +i i;};IFS=' 0123456789 ';set --
$Z;for i;{ [[ $i = , ]]&&i=2;[[ $i = ?? ]]||typeset -l i;j="$j
$i";typeset +l i;};print "$j"



További információk a(z) BSD levelezőlistáról