次のコードスニペット(sh)が見つかりました。
TESTFILE=$TEST_PATH/test.out
if [ -f $TESTFILE ]
then
exec < $TESTFILE
else
echo "$TEST_PATH: no test.out file"
fi
私の質問のポイントは、この行が何をしているかです。 (残りは分かります!)
exec < $TESTFILE
ファイルは実行可能ではなく、他のプロセスを呼び出すこともなく、execがプレーンテキストファイルに対して実行する操作を見つけることができませんでした。
答え1
直感的な理解のために、次のパターンを観察することが役に立ちます。
cmd # fork; execute cmd in child
cmd < /dev/null # fork; redirect stdin and execute cmd in child
exec cmd # execute cmd; no fork
exec cmd < /dev/null # redirect stdin and execute cmd; no fork
exec < /dev/null # redirect stdin; no fork and no execution
ご覧のとおり、exec
これはまったく問題ではありません。これは反対です。 「実行」を意味するものはまったくありません。これは「終わらないで」を意味します。現在のプロセス内でコマンドのリダイレクトおよび/またはコマンドの実行が発生します。
答え2
POSIXの説明ではexec
:
exec - コマンドを実行し、ファイル記述子を開く、閉じる、またはコピーします。
この場合、命令は存在しないため、ファイル記述子のみが変更されます。通常、コマンドラインに書き込むリダイレクトはその行のコマンドに影響します。 exec
現在実行中のシェルをリダイレクトする方法です。