Wenn Sie verwenden strace
, können Sie sehen, wie ein Shell-Skript ausgeführt wird, wenn es ausgeführt wird.
Beispiel
Angenommen, ich habe dieses Shell-Skript.
$ cat hello_ul.bash
#!/bin/bash
echo "Hello Unix & Linux!"
Ausführen mit strace
:
$ strace -s 2000 -o strace.log ./hello_ul.bash
Hello Unix & Linux!
$
Ein Blick in die strace.log
Datei zeigt Folgendes.
...
open("./hello_ul.bash", O_RDONLY) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff0b6e3330) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/bash\n\necho \"Hello Unix & Linux!\"\n", 80) = 40
lseek(3, 0, SEEK_SET) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
fcntl(255, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 255) = 255
close(3)
...
Sobald die Datei eingelesen wurde, wird sie ausgeführt:
...
read(255, "#!/bin/bash\n\necho \"Hello Unix & Linux!\"\n", 40) = 40
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0b38ba000
write(1, "Hello Unix & Linux!\n", 20) = 20
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "", 40) = 0
exit_group(0) = ?
Oben sehen wir deutlich, dass das gesamte Skript als eine einzige Entität eingelesen und danach ausgeführt wird. So würde es zumindest in Bashs Fall "erscheinen", dass es die Datei einliest und sie dann ausführt. Sie denken also, Sie könnten das Skript bearbeiten, während es ausgeführt wird?
HINWEIS: Tun Sie es jedoch nicht! Lesen Sie weiter, um zu verstehen, warum Sie sich nicht mit einer laufenden Skriptdatei anlegen sollten.
Was ist mit anderen Dolmetschern?
Aber deine Frage ist nicht ganz richtig. Es ist nicht Linux, das notwendigerweise den Inhalt der Datei lädt, sondern der Interpreter, der den Inhalt lädt. Es hängt also wirklich von der Implementierung des Interpreters ab, ob die Datei vollständig oder in Blöcken oder Zeilen gleichzeitig geladen wird.
Warum können wir die Datei nicht bearbeiten?
Wenn Sie jedoch ein viel größeres Skript verwenden, werden Sie feststellen, dass der obige Test etwas irreführend ist. Tatsächlich laden die meisten Interpreter ihre Dateien in Blöcken. Dies ist bei vielen Unix-Tools Standard, bei denen Blöcke einer Datei geladen, verarbeitet und dann ein anderer Block geladen wird. Sie können dieses Verhalten anhand dieser Fragen und Antworten zu U & L sehen, die ich vor einiger Zeit grep
mit dem Titel geschrieben habe: Wie viel Text verbraucht grep / egrep jedes Mal? .
Beispiel
Angenommen, wir erstellen das folgende Shell-Skript.
$ (
echo '#!/bin/bash';
for i in {1..100000}; do printf "%s\n" "echo \"$i\""; done
) > ascript.bash;
$ chmod +x ascript.bash
Ergebnis in dieser Datei:
$ ll ascript.bash
-rwxrwxr-x. 1 saml saml 1288907 Mar 23 18:59 ascript.bash
Welche enthält die folgenden Arten von Inhalten:
$ head -3 ascript.bash ; echo "..."; tail -3 ascript.bash
#!/bin/bash
echo "1"
echo "2"
...
echo "99998"
echo "99999"
echo "100000"
Wenn Sie dies mit der gleichen Technik wie oben ausführen, gilt Folgendes strace
:
$ strace -s 2000 -o strace_ascript.log ./ascript.bash
...
read(255, "#!/bin/bash\necho \"1\"\necho \"2\"\necho \"3\"\necho \"4\"\necho \"5\"\necho \"6\"\necho \"7\"\necho \"8\"\necho \"9\"\necho \"10\"\necho
...
...
\"181\"\necho \"182\"\necho \"183\"\necho \"184\"\necho \"185\"\necho \"186\"\necho \"187\"\necho \"188\"\necho \"189\"\necho \"190\"\necho \""..., 8192) = 8192
Sie werden feststellen, dass die Datei in Schritten von 8 KB eingelesen wird, sodass Bash und andere Shells eine Datei wahrscheinlich nicht vollständig laden, sondern in Blöcken einlesen.
Verweise