执行文件如何更改 std 输入?

执行文件如何更改 std 输入?

假设我有一个脚本,其中包含 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命令会将seekstdin 回到开头(显然,如果 stdin 是终端而不是常规文件将无法工作),然后在其中查找标签,并将光标留在文件中。然后 shell 将从那里继续。

如果您希望脚本中的命令从 stdin 的原始内容中读取内容,则可以使用<-特殊的重定向运算符:

cmd <- 

请注意,使用相同的命令,如果您按以下方式调用 Thomson shell 脚本,goto您的脚本也可以使用:bash

bash < the-script

ksh93goto可以用特殊的方法来模拟寻求重定向运算符。例如这个 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

相关内容