cat < file.txt ファイルを読む責任は誰にありますか?

cat < file.txt ファイルを読む責任は誰にありますか?
cat < file.txt

ファイルを読む責任は誰にありますか?

シェルはファイルを開いて読み込み、その内容をコマンドの標準入力に書き込みますか?

ベストアンサー1

シェルコマンドの場合cat <file.txt:

  1. リダイレクト演算子を使用<すると、シェルが読み取りfile.txt用に開かれます。
  2. シェルはcatfile.txt
  3. このcatコマンドは、標準入力(so file.txt)から内容を読み取り、その内容を標準出力にコピーします。

つまり、ファイルを開くことはシェルであり、catデータを読み込むことはコマンドです。

シェルとそのサブプロセスで実行されているシステムコールを一覧表示して、何が起こっているのかを確認できます。 Linuxの場合:

$ strace -f sh -c 'cat <file.txt' >/dev/null
execve("/bin/sh", ["sh", "-c", "cat <file.txt"], [/* 76 vars */]) = 0
open("file.txt", O_RDONLY) = 3
dup2(3, 0)                              = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbc737539d0) = 22703
[pid 22702] wait4(-1,  <unfinished ...>
[pid 22703] execve("/bin/cat", ["cat"], [/* 76 vars */]) = 0
[pid 22703] read(0, "wibble"..., 32768) = 6
[pid 22703] write(1, "wibble"..., 6) = 6
[pid 22703] read(0, "", 32768)          = 0
[pid 22703] close(0)                    = 0
[pid 22703] close(1)                    = 0
[pid 22703] close(2)                    = 0
[pid 22703] exit_group(0)               = ?
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 22703
--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigreturn(0x11)                      = 22703

(22702は親シェルプロセス、22703は子プロセスですcat。)

シェルコマンドはcat file.txt異なる動作をします。

  1. シェルはcatコマンドを実行し、コマンドに1つの引数を渡しますfile.txt
  2. プログラムが読み取り用にcat開きます。file.txt
  3. このcatコマンドはfile.txt内容を読み取り、標準出力にコピーします。

おすすめ記事