davkovy soubor
Pavel Kankovsky
peak na argo.troja.mff.cuni.cz
Neděle Listopad 26 19:58:25 CET 2000
On Sun, 26 Nov 2000, Pavel Urban wrote:
> strucne, jasne, lehce zdesene: kdyz spustim shell script v bashi a behem
> jeho behu ho prepisu, ovlivni to jeho cinnost?
Odpoved zni: jak kdy. Musite totiz znat odpoved na par otazek:
1. Co znamena, ze ho prepisete? Budete modifikovat ten puvodni soubor,
nebo stary smazete a na jeho miste vytvorite novy?
2. Precte bash cely skript najednou, nebo ho bude cist po castech?
Ad 1. Zmeny v chovani muzete ocekavat pouze v pripade, ze budete skutecne
modifikovat puvodni soubor (a nikoli pouze to, jaky soubor se schovava
pod zadanym jmenem).
Ad 2. Predstavime-li si skript jako sekvenci prikazu (at elementarnich
nebo strukturovanych, napr. if), pak bash cte soubor prave po elementech
teto sekvence. Dobre je to videt, kdyz ho spustite s parametrem -v.
Viz tez nize citovany vysledek programu strace. Priznam se ale, ze
netusim, je-li nejak standardizovane chovani, nebo jen logicky dusledek
navrhu (snaha usetrit pamet vs. schopnost interpretovat strukturovane
prikazy); treba Perl nejdriv precte cely skript a pak ho teprve vykonava.
IMHO bude nejlepe, kdyz se modifikaci skriptu nebezpecnym zpusobem
(viz 1) vyhnete velkym obloukem.
On Sun, 26 Nov 2000, Milan Kerslager wrote:
> Zalezi na tom, kolik toho ma shell v pameti. Funguje totiz tak, ze soubor
> interpretuje, tj. cte a vykonava instrukce po radcich.
To si tak trochu asi pletete s command.com. :)
Ve skutecnosti je chovani komplikovanejsi...
> Pak ho spustte a za chodu do nej neco pridejte. Muzete si udelat i smycku
> a tu za behu modifikovat (a zmeneny soubor ulozit):
>
> while true; do
> echo kuk
> sleep 2
> done
Asi ne. Mejme trochu komplikovanejsi skript:
#!/bin/sh
echo kuk1
sleep 2
echo kuk2
sleep 2
while true; do
echo kuk
sleep 2
done
$ strace -e trace=read,lseek ./skript.sh
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3"..., 4096) = 4096
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3"..., 4096) = 4096
read(3, "#\n# /etc/nsswitch.conf\n#\n# An"..., 4096) = 1208
read(3, "", 4096) = 0
read(3, "root:x:0:0:Yer Big Brother:/root"..., 4096) = 1369
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/sh\necho kuk1\nsleep 2\ne"..., 80) = 80
lseek(3, 0, SEEK_SET) = 0
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/sh\necho kuk1\nsleep 2\ne"..., 88) = 88
kuk1
lseek(3, -60, SEEK_CUR) = 28
--- SIGCHLD (Child exited) ---
read(3, "echo kuk2\nsleep 2\n\nwhile true"..., 88) = 60
kuk2
lseek(3, -42, SEEK_CUR) = 46
--- SIGCHLD (Child exited) ---
read(3, "\nwhile true; do\n echo kuk\n "..., 88) = 42
--- SIGCHLD (Child exited) ---
kuk
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
kuk
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
kuk
...
Jak vidime, cast se smyckou while je ctena pouze jedenkrat. Mate kolego
dvacet trestnych bodu za sireni dezinformaci. :)
--Pavel Kankovsky aka Peak [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."
Další informace o konferenci Linux