手动提问

手动提问

嘿:)我正在尝试理解 goto 命令。我对 goto 手册有一些疑问。您可以在这里找到原始手册:http://man.cat-v.org/unix-6th/1/goto

1. 仅当 t̲h̲e̲ S̲h̲e̲l̲l̲ i̲s̲ t̲a̲k̲i̲n̲g̲ c̲o̲m̲m̲a̲n̲d̲s̲ f̲r̲o̲m̲ a̲ f̲i̲l̲e̲时才允许转到。

下划线部分是什么意思?我不允许在 shell 中输入 goto 吗?但是如果将 goto 写入文件就一切正常了吗?

2. 从头开始搜索文件中以“:”开头的行,后跟一个或多个空格,后跟标签。

所以如果我的文件的一部分看起来像这样

...
goto end
...

然后他会寻找像这样的部分 : end,但我看过一些脚本,我认为它们来自 Unix v6,它每次都看起来像这样 end:那么现在正确的顺序是什么?

3. 如果找到这样的行,则 goto 命令返回。由于命令文件中的读指针指向标签后面的行,因此效果是使Shell转移到标签行。

在带有“:”的行中写入任何其他命令是否合法?例如:end echo "Hello"end: echo "Hello"

感谢您的帮助,祝圣诞快乐:)

答案1

以下是 Unix 和 V6 shell 的主要功能goto

  • 当进程分叉时,其所有打开的文件描述符都在父进程和子进程之间共享。
  • 这意味着任何进程对文件读/写偏移量的任何重新定位都将反映在具有相同共享文件描述符的所有进程中。
  • V6 shell 从标准输入中一次读取一个字符,没有缓冲。
  • 当 V6 shell 运行脚本时,任何由 V6 shell 创建的从 stdin 读取数据或使用系统seek调用移动 stdin 的读/写偏移量的进程都将从 shell 读取数据并移动 shell 的读/写偏移量脚本。
  • shell 的:命令是一个(几乎)不执行任何操作的命令,因此它的用途之一是作为goto目标。除了检查参数是否存在语法错误(以及在现代 shell 中,扩展 shell 变量,这可能会导致副作用)之外,不会对其参数执行任何操作。
    : > file是一种截断文件的方法。
    : end echo "hello"不会输出任何内容。这些其他示例
    :end echo "hello"end: echo "hello",将尝试运行命令:endend:,这可能不存在。
  • goto命令将 stdin 的读/写偏移量设置为 0(shell 脚本的开头),并读取 stdin,查找以:、一个或多个空格、传递给 的参数goto以及空格或换行符开头的行。当它找到匹配时,它会退出,将读/写偏移量保留在该行之后,这就是 shell 将恢复执行脚本的位置。

您可以在这里查看来源gotohttp://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/s1/goto.c

你问

我不允许在 shell 中输入 goto 吗?

你可以。该goto命令将检查 stdin 是否来自终端;如果是这样,它将写入一条错误消息并退出。

相关内容