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


답변:


106

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

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

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


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

2
참고 ksh93한 cat내장은 (당신이하지 않으면 기본적으로 사용되지 않습니다 /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그럼에도 불구 열립니다 file1과 file2와 같은, 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.