调用shell脚本时是否完整读取?

时间:2013-08-03 15:46:47

标签: shell unix scripting solaris ksh

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

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

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

3 个答案:

答案 0 :(得分:1)

没有。 Shell脚本可以逐行读取,也可以按{-1}}逐个命令读取,但;块之类的块除外,这些块被解释为块:

  

shell脚本是包含shell命令的文本文件。当这样的   在调用Bash时,file被用作第一个非选项参数   既不提供-c也不提供-s选项(请参阅调用Bash),Bash   从文件中读取并执行命令,然后退出。这种模式   操作创建一个非交互式shell。

您可以通过在命令行上手动输入命令来证明shell等待if ... fifi执行命令。

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会逐行解释它并不关心文件末尾的垃圾。您只需确保脚本的执行在到达二进制部分之前终止。