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