
goto コマンドを含むスクリプトがあるとします。
gotoコマンドは、標準入力このような行の場合: jumpHere
。
ただし、デフォルトでは標準入力はターミナルです。これは、ファイル/スクリプトが goto コマンドの標準入力である場合にのみ意味を持ちます。では、std 入力を変更するのはどこ/誰/何でしょうか?
ps. 古い Thompson-Shell、Unix v6 について話しています。
答え1
これはgoto
別のユーティリティであり、厳密には Thompson シェルの一部ではないことに注意してください。
Thomson シェルを次のように呼び出します。
sh the-script
sh
the-script
(fd 0)で開くとstdin
、次のように記述したのと同じになります。
sh < the-script
その代わり。
このgoto
コマンドは、seek
stdin を先頭まで戻します (stdin が端末で通常のファイルでない場合は当然機能しません)。次に、そこでラベルを検索し、その直後のファイルにカーソルを残します。その後、シェルはそこから処理を続行します。
スクリプト内のコマンドで stdin の元の内容を読み取る場合は、<-
特別なリダイレクト演算子を使用します。
cmd <-
同じコマンドで、次のように Thomson シェル スクリプトを呼び出す場合goto
もスクリプトが機能することに注意してください。bash
bash < the-script
ksh93
goto
特別な求めるリダイレクト演算子。たとえば、次の Thomson シェル スクリプト:
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