cat sth
나는 둘 다 cat < sth
정확히 동일한 출력을 제공한다는 것을 깨달았습니다 . 그들은 동일합니까?
답변1
그들은 정확히 동일하지 않습니다. 중요한 경우 리디렉션 방법은 종종 더 짜증나고 모호한 결과를 제공합니다(물론 이것이 아마도 원하는 것일 수도 있습니다).
$ cat < /proc/self/maps
$ cat /proc/self/maps
55c61257e000-55c61258a000 r-xp 00000000 fd:00 1180143 /usr/bin/cat
...
또는 grep, 검색 프로그램을 사용해 보세요.
$ grep "grep" /proc/self/exe
Binary file /proc/self/exe matches
$ grep "grep" < /proc/self/exe
$
sudo
약간의 치트이지만 액세스 권한이 있는 명령을 실행하기 위해 를 사용할 때 이런 문제가 발생할 가능성이 가장 높습니다 root
.
$ sudo cat < /etc/shadow
bash: /etc/shadow: Permission denied
$ sudo cat /etc/shadow
root:!::0:99999:7:::
....
답변2
cat
그의 직업은 속이는 것이다고양이enate는 모든 것을 가져온 다음 stdout에 인쇄하지만 일반적으로 단일 파일의 내용을 인쇄하는 데 사용됩니다(물론 파일의 내용을 연결한 다음 stdout에 씁니다). stdout(표준 출력)은 단순히 프로그램이 일반적으로 쓰는 출력 데이터입니다. (일부 프로그램(예: dd
)은 인수가 달리 나타내지 않는 한 출력 데이터를 stdout에 기록하며, 오류가 발생할 때 프로그램이 기록하는 표준 오류 채널인 stderr도 있습니다.)
cat
stdin(표준 입력)을 통해 또는 인수로 전달된 파일에서 데이터를 얻을 수 있습니다.
당신이 해야 할 일은 cat sth
파일의 모든 내용을 표준 출력에 쓰도록 지시하는 단일 인수를 사용하여 호출하는 것뿐입니다. 더 많은 파일 이름을 추가하고 연결되어 표준 출력에 기록되는 파일의 내용을 볼 수 있습니다.cat
sth
cat
sth
cat < sth
를 호출하기 전에 stdin을 파일 내용으로 변경합니다 cat
. 그런 다음 모든 것을 표준 입력에서 읽고 표준 출력에 기록합니다.sth
cat
cat
두 경우 모두 cat
파일 내용이 sth
표준 출력에 기록됩니다. 이에 대해 더 자세히 읽을 수 있습니다.여기또한 man cat
터미널에 입력하여 cat
해당 기능을 설명하는 매뉴얼 페이지를 읽을 수도 있습니다.
의 내용은 sth
로그인한 사용자가 읽으며(터미널에 로그인한 사용자는 반드시 그래픽 세션에 로그인한 사용자일 필요는 없음(있는 경우)) 프로그램에서 사용할 수 있습니다. 다른 권한을 앞에 쓴 다음 sudo
이를 실행하는 사용자의 권한으로 읽습니다. 로그인한 사용자와 전환한 사용자 sudo
(반드시 그럴 필요는 없으며 root
다르게 지정할 수 있음)가 읽으려는 파일에 대한 액세스 권한이 다를 수 있으므로 결과가 다를 수 있습니다.
답변3
특정 파일 인쇄의 경우에는 cat
or 를 사용하는 것과 마찬가지로 유효합니다 sth
. 명령은 명령줄 인수로 제공된 모든 파일을 인쇄하도록 설계되었기 때문입니다(경우: 문자열을 인수로 받고 파일을 엽니다). 주어진 파일은 표준 입력을 인쇄합니다(이 경우 쉘은 표준 입력을 열고 연결하여 리디렉션을 따릅니다).cat sth
cat <sth
cat
cat sth
cat
sth
cat <sth
sth
cat
따라서 두 경우 모두 동일한 동작이 특정합니다 cat
. 표준 입력이나 명령줄 인수 중 하나만 허용하도록 설계된 명령에서는 전혀 작동하지 않을 수 있습니다. 다른 경우에는 표준 입력을 통해 데이터를 가져올 때 명령이 파일 이름에 액세스할 수 없기 때문에 동작이 약간 다를 수 있습니다.
$ grep -H foo sth
sth:foo
$ grep -H foo <sth
(standard input):foo