あなたは「それがどのように機能するか」と尋ねます。UNIX プロセスは、 と呼ばれるアクションを使用して作成されfork
ます。これは、現在のプロセスのコピーを取り、非常に効率的な方法でほぼそのままコピーします。コピーには、stdin、stdout、stderr が存在するファイル記述子テーブルも含まれます。
リダイレクトを行うと、シェルは分岐し、子の独自のファイル記述子 (fd) テーブルを変更します。次に、同じプロセスで同じ fd テーブルを使用して新しいスクリプトを実行します。従来のメカニズムを使用すると、プロセスがチェックできる唯一のことは、stdin が端末に接続されているかどうかです。Cでは使用isatty()
し、bashでは使用できますif [[ -t 0 ]]...
(ゼロは標準入力のfdです)。
Linux (Linux を使用している場合) では、追加のオプションがあります/proc/$$/fd
。fd テーブルは、読み取り可能な形式で表示されます ($$ は現在のプロセス ID を示します)。 ls -l /proc/$$/fd
そして、あなたは私が何を意味するかを見るでしょう.
それで、私はリダイレクトされますか?
if [[ -t 0 ]] # is stdin a terminal?
then
suffix=""
else
line=$(ls -l /proc/$$/fd/0)
file="${line##*-> }"
suffix="< $file"
fi
echo "cat $suffix"
コマンドラインで:
/home/user1$ file_redirection.sh < tmp_file
cat < /home/qa/tmp_file
しかし。なぜあなたはそれをしたいのですか?