假设我有一个脚本,其中包含 goto 命令。
goto 命令将在标准输入对于这样的一行: jumpHere
。
但 std 输入默认是终端。仅当文件/脚本是 goto 命令的标准输入时才有意义。那么哪里/谁/什么改变了标准输入?
附注我说的是旧的 Thompson-Shell,Unix v6。
答案1
请注意,这goto
是一个单独的实用程序,因此本身不是 Thompson shell 的一部分。
当您调用 Thomson shell 时:
sh the-script
sh
打开(fd 0) 就像你写的the-script
一样stdin
sh < the-script
反而。
该goto
命令会将seek
stdin 回到开头(显然,如果 stdin 是终端而不是常规文件将无法工作),然后在其中查找标签,并将光标留在文件中。然后 shell 将从那里继续。
如果您希望脚本中的命令从 stdin 的原始内容中读取内容,则可以使用<-
特殊的重定向运算符:
cmd <-
请注意,使用相同的命令,如果您按以下方式调用 Thomson shell 脚本,goto
您的脚本也可以使用:bash
bash < the-script
ksh93
goto
可以用特殊的方法来模拟寻求重定向运算符。例如这个 Thomson shell 脚本:
echo Start
: start
ls -ld /proc/self/fd/0
sleep 1
goto start
echo End never reached
可以写成ksh93
这样:
echo Start
: start
ls -ld /proc/self/fd/0
sleep 1
exec <#((0)) <#": start"
echo End never reached
当调用时,两者都会运行(假设您有 V6goto
命令) :ksh93
ksh93 < the-script