次のシェルシーケンスはなぜそんなに早く終わるのですか?

次のシェルシーケンスはなぜそんなに早く終わるのですか?

ファイルを作成し、次のシェル順にアクセス権を定義しますcomfic

$ cat com
if tty>/dev/null
    then read x
    else read x<fic
fi
echo $x
$ cat fic
abcd
$ ls -l com fic
-r-xr-xr-x  1 jmr    ens    70 Jan 22 09:41 com
-r--r--r--  1 jmr    ens    5 Jan 22 09:41 fic
$

echo $x起動時に(フォアグラウンドで)停止するのはなぜですか?読まなければならcomないのではないかfic

答え1

if tty>/dev/null ; then
    read x
else
    read x<fic
fi

つまり、ficエラーが返された場合にのみ読み取られます。ttyこれは端末ではないことがわかったときに発生stdinします。通常、これはスクリプトがパイプラインにある場合、またはnohupcronジョブを介してまたはリモートで実行されたときに発生しますssh -T

条件付きで使用することは[ -t 0 ]ほぼ同じです([現在akaが一般的に組み込まれているので、より高速です)。test

答え2

com シェルスクリプトがフォアグラウンドで実行されるとread実際のtty

行を入力すると、そのread行が終了し、その行が変数に設定されますx

関連情報