3

我问是因为我最近对正在执行的 KornShell (ksh) 脚本进行了更改。保存更改后不久,执行过程失败。从错误消息来看,正在运行的进程似乎已经看到了我的一些(但不是全部)更改。这强烈表明当调用 shell 脚本时,整个脚本不会被读入内存。

如果这个结论是正确的,它表明应该避免对正在运行的脚本进行更改。

$ uname -a
SunOS blahblah 5.9 Generic_122300-61 sun4u sparc SUNW,Sun-Fire-15000
4

3 回答 3

1

不可以。Shell 脚本可以逐行读取,也可以逐个命令后跟;s 读取,但块除外,例如if ... fi被解释为块的块:

shell 脚本是一个包含 shell 命令的文本文件。如果在调用 Bash 时将此类文件用作第一个非选项参数,并且既没有提供 -c 选项也没有提供 -s 选项(请参阅 Invoking Bash),Bash 从文件中读取并执行命令,然后退出。这种操作模式创建了一个非交互式外壳。

fi您可以通过在命令行上手动键入命令来演示 shell 等待if块执行命令。

http://www.gnu.org/software/bash/manual/bashref.html#Executing-Commands

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Scripts

于 2013-08-03T19:06:32.473 回答
0

有趣的是,我知道的大多数操作系统都不读取内存中任何脚本的全部内容,而是从磁盘运行它。否则将允许在运行时对脚本进行更改。鉴于以下事实,我不明白为什么要这样做:

  • 脚本通常非常小(无论如何也不占用太多内存)
  • 在某些时候,并在这个线程中显示,人们会开始对已经运行的脚本进行更改

但是,承认这一点,这里有一些事情要考虑:如果您确定脚本运行不正常(因为您正在编写/更改/调试),您是否关心该脚本的其余运行?您可以继续进行更改,保存它们,并忽略当前运行完成的所有输出和操作。

但是.. 有时,这取决于所讨论的脚本,同一脚本的后续运行(修改或未修改)可能会成为问题,因为当前/上一次运行正在执行异常运行。它通常会跳过一些东西,或者突然跳到脚本中的部分,它不应该。这可能是个问题。它可能会使“事物”处于不良状态;特别是如果涉及文件操作/创建。

因此,作为一般规则:即使操作系统支持或不支持该功能,最好让当前运行完成,然后保存更新的脚本。您已经可以更改它,但不要保存它。

这不像在过去的 DOS 中,实际上你面前只有一个屏幕(一个 DOS 屏幕),所以你不能说你需要等待运行完成,然后才能再次打开文件。

于 2014-11-23T16:51:51.477 回答
0

不,他们不是,这有很多很好的理由。您应该记住的一件事是,即使有一些相似之处,shell 也不是解释器。Shell 旨在处理命令流。来自 TTY、PIPE、FIFO 甚至是套接字。shell 逐行读取其资源,直到EOF内核返回 a。大多数 shell 对解释文件没有额外的支持。他们使用文件就像使用终端一样。事实上,这被认为是一个不错的功能,因为您可以做一些有趣的事情,比如Linux 二进制安装程序(.bin、.sh)如何工作?

您可以使用二进制文件并预先添加 shell 脚本。你不能用口译员来做这件事。因为它会解析整个文件,或者至少它会尝试并失败。shell 只会逐行解释它,而不关心文件末尾的垃圾。您只需确保脚本的执行在到达二进制部分之前终止。

于 2017-08-06T11:49:11.973 回答