実行ファイルはstd入力をどのように変更しますか?

実行ファイルはstd入力をどのように変更しますか?

gotoコマンドを含むスクリプトがあるとします。

gotoコマンドは標準入力このような行の場合: jumpHere

ただし、標準入力はデフォルトで端末に設定されます。ファイル/スクリプトがgotoコマンドの標準入力である場合にのみ意味があります。それでは、どこ/誰/何が標準入力を変更しましたか?

PS私は以前のThompson-Shell、Unix v6について話しています。

答え1

これはgoto別のユーティリティなので、Thompson シェル自体の一部ではありません。

Thomson シェルを呼び出す場合:

sh the-script

sh書いたthe-scriptように(fd 0)を開くstdin

sh < the-script

代わりに。

このgotoコマンドはseekstdinを最初に戻し(明らかにstdinが通常のファイルではない端末の場合は機能しません)、その中でタグを見つけてファイルにカーソルを置きます。その後、シェルはそこから続きます。

スクリプトのコマンドがstdinの生の内容を読み取るようにするには、<-特別なリダイレクト演算子を使用できます。

cmd <- 

同じコマンドを使用すると、goto次のようにThomsonシェルスクリプトを呼び出す場合でもスクリプトが機能します。bash

bash < the-script

ksh93goto特別な方法でシミュレーション可能救うリダイレクト演算子。たとえば、次の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

呼び出されると、両方が実行されます(V6コマンドがあると仮定goto)。ksh93

ksh93 < the-script

関連情報