
假設我有一個腳本,其中包含 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
標準輸入返回到開頭(顯然,如果標準輸入是終端機而不是常規文件,則不起作用),然後在其中尋找標籤,並將遊標留在文件中。然後 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