cat < file.txt
파일을 읽는 책임은 누구에게 있습니까?
쉘이 파일을 열고 읽은 다음 해당 내용을 명령의 표준 입력에 기록합니까?
답변1
쉘 명령의 경우 cat <file.txt
:
- 리디렉션 연산자를 사용
<
하면 쉘이file.txt
읽기 위해 열리게 됩니다. - 쉘 은
cat
.file.txt
- 이
cat
명령은 표준 입력(sofile.txt
)에서 내용을 읽고 해당 내용을 표준 출력에 복사합니다.
즉, 파일을 여는 것은 쉘이고, cat
데이터를 읽는 것은 명령이다.
셸과 해당 하위 프로세스에서 실행되는 시스템 호출을 나열하여 무슨 일이 일어나고 있는지 관찰할 수 있습니다. 리눅스의 경우:
$ 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
다르게 작동합니다.
- 셸은
cat
명령을 실행하고 명령에 하나의 인수를 전달합니다file.txt
. - 프로그램 이 읽기 위해
cat
열립니다 .file.txt
- 이
cat
명령은file.txt
내용을 읽고 표준 출력에 복사합니다.
답변2
당신 말이 맞아요. 대부분의 경우 이는 중요하지 않지만 셸과 프로세스에 다른 권한이 있으면 문제가 될 수 있습니다.
호출하는 프로세스에 상승된 권한(예 sudo
: setuid)이 있는 경우 해당 권한을 사용하여 셸에서 열 수 없는 파일을 열 수 있습니다.
$ sudo cat < /etc/shadow | wc
-bash: /etc/shadow: Permission denied
0 0 0
$ sudo cat /etc/shadow | wc
64 64 1843