"cat"과 "cat <"의 차이점


답변:


106

첫 번째 경우 cat파일을 열고 두 번째 경우 셸에서 파일을 열고 cat표준 입력 으로 전달합니다 .

기술적으로 그들은 다른 효과를 가질 수 있습니다. 예를 들어, cat프로그램 보다 더 많거나 적은 권한을 가진 쉘 구현이 가능할 수 있습니다 . 이 시나리오의 경우 파일을 열지 못하는 반면 다른 파일은 열 수 없습니다.

이것은 일반적인 시나리오는 아니지만 쉘과 cat동일한 프로그램은 아니라고 언급했습니다 .


83
예, 예를 들어 할 수 있습니다 sudo cat myfile.txt. 그러나 sudo cat < myfile.txt파일을 읽을 수있는 권한이 없으면 작동하지 않습니다.
zuazo

2
참고 ksh93cat내장은 (당신이하지 않으면 기본적으로 사용되지 않습니다 /opt/ast/bin귀하의 초기 $PATH하지만).
Stéphane Chazelas

2
일부 프로그램은 파일 이름 인수 또는 stdin을 가져 오는지 여부에 따라 다르게 작동합니다. 예를 들어, wc인수가 주어지면 카운트 전에 파일 이름을 인쇄합니다.
Barmar

21

테스트 케이스에는 눈에 띄는 차이가 없습니다. 가장 확실한 것은 myfile.txt현재 디렉토리에 이름이 지정된 파일 이 없거나 읽을 수 없는 경우 나타나는 오류 메시지 입니다.

전자의 경우, cat불평하고 후자의 경우, 쉘은 파일을 열려고하는 프로세스 cat, 전자 의 프로세스 및 후자의 쉘을 명확하게 보여줍니다 .

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

보다 일반적인 경우, 큰 차이점은 재 지정을 사용하여 둘 이상의 파일의 내용을 인쇄하는 데 사용할 수 없다는 것입니다. 이는 cat(예 : cat enate) 명령 의 원래 목적을 모두 따릅니다. 쉘은 경로 재 지정된 입력으로 전달 된 모든 파일을 열려고 시도하지만 실제로 는 "zshism" cat을 사용하지 않는 한 마지막 파일 만 전달합니다 .zshmultios

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

표준 시스템에서 셸 cat은 파일 액세스 권한에 차이가 없으므로 둘 다 동일하게 실패합니다. Thomas Dickey의 답변과 첨부 된 의견이 이미 제안했듯이의 권한 sudo을 높이는 데 사용하면 cat행동에 큰 차이가 있습니다.


5
호기심에서 당신은 정말로 ksh자신의 의지를 사용 합니까? 그렇다면 ...
고양이

1
@cat-그 질문은 분명히 무지에 근거합니다. 직접 만들고 참조하십시오.
mikeserv

2
플립 팬트를 의도 한 @mikeserv, 심각하게 무례하지는 않지만 공정한 것으로 생각합니다.
cat

2
@cat-나는 그렇지 않다고 생각했습니다. 무지가 부끄러워하는 것은 아닙니다. 지식의 부족 일뿐입니다. 왜 누군가가 ksh93을 사용하도록 선택할 수 있는지 이해하지 못한다면, 결코 사용하지 않았기 때문이라고 생각할 수 있습니다. 그래서 당신이하는 것이 좋습니다. 시도해 볼 가치가 있습니다. 난에 비해, 당신을 말할 때 날 믿어 bash, ksh93멀리 멀리 더 나은 쉘입니다. 그건 거의 쉘.
mikeserv

5
@mikeserv가 다른 곳 에서 지적했듯이 읽을 수 없거나 존재하지 않는 경우와 는 cat < file1 > file2매우 다른 효과가 있습니다 . 후자의 형식은 잘립니다 . 전자는 그렇지 않습니다.cat file1 > file2file1file2
Wildcard

7

cat myfile.txt파일 myfile.txt을 읽은 다음 표준 출력으로 인쇄합니다.

cat < myfile.txt여기 cat에는 열려는 파일이 없으므로 많은 유닉스 명령과 마찬가지로 표준 입력에서 데이터를 읽습니다.이 입력 file.txt은 쉘 에서 지시 하고 표준 출력으로 인쇄합니다.


6

@Thomas Dickey 의 답변은 훌륭합니다.

여러 파일을 읽는 경우에 대한 몇 가지 명백한 사실을 추가하고 싶습니다 (질문과 관련이 없지만 여전히).

  • cat <file1 <file2 <file3적어도 bash에서 file3 만 읽습니다. (사실, 쉘에 따라 다르지만 대부분의 쉘 것이다 DUP 효과에 마지막 원인 표준 입력에 대한 모든 지정된 파일을.)
  • cat file1 file2 file3모든 지정된 파일을 순차적으로 읽을 것이다 (실제로 고양이는 단어의 형태로 단축 합칠 ).
  • cat file1 file2 file3 <file4 <file5 <file6 file1, file2, file3 만 읽습니다 (filename 인수가 전달 될 때 cat이 stdin을 무시하므로).
    • cat file1 file2 - file3 <file4 <file5 <file6 하이픈은 cat이 stdin을 무시하지 않도록 file1, file2, file6, file3을 읽습니다.

그리고 오류에 대해. 인수로 지정된 일부 파일 을 수없는 경우 ()없이 <cat은 실패한 파일을 건너 뛰지 만 (stderr에 관련 메시지를 출력하여) 다른 파일을 읽습니다. 리디렉션 ( <) 으로 지정된 파일 중 하나 이상을 열 수없는 경우 쉘은 cat을 시작하지도 않습니다 (이는 실제로 cat에서 사용하지 않는 리디렉션에도 발생 함). 두 경우 모두 잘못된 종료 코드가 반환됩니다.


1
첫 번째 예제에서 참고 cat그럼에도 불구 열립니다 file1file2와 같은, file4그리고 file5세 번째 예이다. file3, 표시 만 나타납니다 . file6이전에 열린 지시 사항이 성공하면 내용.
jlliagre

@jlliagre, 고마워, 난 몰랐어. 스트 레이스는 분명히 당신의 정확성을 증명했습니다. 사례 1과 3a의 괄호 안에있는 텍스트를 수정했습니다.
sasha

0

다른 명령을 사용하여 다음의 차이점을 알 수 있습니다.

wc –w food2.txt .

가능한 출력 :

6 food2.txt .

이 명령은 파일 이름을 알고 있기 때문에 파일 이름을 알려줍니다 (인수로 전달됨).

wc –w < food2.txt .

가능한 출력 :

6 .

표준 입력은 명령에 대해 알지 않고 food2.txt 파일로 리디렉션됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.