我问,因为我最近对正在执行的KornShell(ksh)脚本进行了更改。保存更改后不久,执行过程失败。从错误消息来看,似乎正在运行的进程已经看到了一些 - 但不是全部 - 我的更改。这有力地表明,当调用shell脚本时,整个脚本不会被读入内存。
如果这个结论是正确的,它表明应该避免对正在运行的脚本进行更改。
$ uname -a
SunOS blahblah 5.9 Generic_122300-61 sun4u sparc SUNW,Sun-Fire-15000
答案 0 :(得分:1)
没有。 Shell脚本可以逐行读取,也可以按{-1}}逐个命令读取,但;
块之类的块除外,这些块被解释为块:
shell脚本是包含shell命令的文本文件。当这样的 在调用Bash时,file被用作第一个非选项参数 既不提供-c也不提供-s选项(请参阅调用Bash),Bash 从文件中读取并执行命令,然后退出。这种模式 操作创建一个非交互式shell。
您可以通过在命令行上手动输入命令来证明shell等待if ... fi
块fi
执行命令。
http://www.gnu.org/software/bash/manual/bashref.html#Executing-Commands
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Scripts
答案 1 :(得分:0)
有趣的是,我知道的大多数操作系统,都不会读取内存中任何脚本的全部内容,而是从磁盘运行它。否则将允许在运行时对脚本进行更改。鉴于以下事实,我不明白为什么要这样做:
但是,承认这一点,这里需要考虑一下:如果您认为脚本运行不正常(因为您正在编写/更改/调试),您是否关心该脚本的其余运行?你可以继续进行更改,保存它们,并忽略当前运行完成的所有输出和操作。
但是..有时,这取决于相关脚本,后续运行相同的脚本(已修改或未修改)可能会成为问题,因为当前/上一次运行正在执行异常运行。它通常会跳过一些东西,或者只是跳到脚本中的部分,它不应该。这可能是个问题。它可能使“事物”处于不良状态;特别是如果涉及文件操作/创建。
因此,作为一般规则:即使操作系统支持该功能,最好让当前运行完成,然后保存更新的脚本。您可以更改它,但不要保存它。
这不像过去的DOS,你实际上只有一个屏幕在你面前(一个DOS屏幕),所以你不能说你需要等待运行完成,然后才能打开文件试。
答案 2 :(得分:0)
不,他们不是,而且有很多充分的理由。
你应该记住的一件事是,即使有一些相似之处,shell也不是解释器。外壳设计用于处理命令流。来自TTY,PIPE,FIFO甚至套接字。
shell逐行读取其资源,直到内核返回EOF
为止。
大多数shell对解释文件没有额外的支持。他们使用文件,因为他们将使用终端。
事实上,这被认为是一个很好的功能,因为你可以做有趣的事情,如--data-urlencode <data>
您可以使用二进制文件并添加shell脚本。你不能用翻译来做这件事。因为它解析整个文件,或者至少它会尝试并失败。 shell会逐行解释它并不关心文件末尾的垃圾。您只需确保脚本的执行在到达二进制部分之前终止。