For this question, let's consider a bash shell script, though this question must be applicable to all types of shell script.When someone executes a shell script, does Linux load all the script at once (into memory maybe) or does it read script commands one by one (line by line)?In other words, if I execute a shell script and delete it before the execution completes, will the execution be terminated or will it continue as it is?
How Does Linux deal with shell scripts?
linux;shell;shell script
If you use strace you can see how a shell script is executed when it's run. ExampleSay I have this shell script.$ cat hello_ul.bash #!/bin/bashecho Hello Unix & Linux!Running it using strace:$ strace -s 2000 -o strace.log ./hello_ul.bashHello Unix & Linux!$Taking a look inside the strace.log file reveals the following....open(./hello_ul.bash, O_RDONLY)       = 3ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff0b6e3330) = -1 ENOTTY (Inappropriate ioctl for device)lseek(3, 0, SEEK_CUR)                   = 0read(3, #!/bin/bash\n\necho \Hello Unix & Linux!\\n, 80) = 40lseek(3, 0, SEEK_SET)                   = 0getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0fcntl(255, F_GETFD)                     = -1 EBADF (Bad file descriptor)dup2(3, 255)                            = 255close(3)     ...Once the file's been read in, it's then executed:...read(255, #!/bin/bash\n\necho \Hello Unix & Linux!\\n, 40) = 40rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0b38ba000write(1, Hello Unix & Linux!\n, 20)   = 20rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0read(255, , 40)                       = 0exit_group(0)                           = ?In the above we can clearly see that the entire script appears to be being read in as a single entity, and then executed there after. So it would appear at least in Bash's case that it reads the file in, and then executes it.  So you'd think you could edit the script while it's running? NOTE: Don't, though! Read on to understand why you shouldn't mess with a running script file.What about other interpreters?But your question is slightly off. It's not Linux that's necessarily loading the contents of the file, it's the interpreter that's loading the contents, so it's really up to how the interpreter's implemented whether it loads the file entirely or in blocks or lines at a time.So why can't we edit the file?If you use a much larger script however you'll notice that the above test is a bit misleading. In fact most interpreters load their files in blocks. This is pretty standard with many of the Unix tools where they load blocks of a file, process it, and then load another block. You can see this behavior with this U&L Q&A that I wrote up a while ago regarding grep, titled: How much text does grep/egrep consume each time?.ExampleSay we make the following shell script.$ (     echo '#!/bin/bash';     for i in {1..100000}; do printf %s\n echo \$i\; done   ) > ascript.bash;$ chmod +x ascript.bashResulting in this file:$ ll ascript.bash -rwxrwxr-x. 1 saml saml 1288907 Mar 23 18:59 ascript.bashWhich contains the following type of content:$ head -3 ascript.bash ; echo ...; tail -3 ascript.bash #!/bin/bashecho 1echo 2...echo 99998echo 99999echo 100000Now when you run this using the same technique above with 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) = 8192You'll notice that the file is being read in at 8KB increments, so Bash and other shells will likely not load a file in its entirety, rather they read them in in blocks.ReferencesThe #! magic, details about the shebang/hash-bang mechanism on various Unix flavours