월별 글 목록: 2021년 7월월

“cat”과 “cat <“의 차이점 cat < myfile.txt. 이

튜토리얼을 진행하면서 cat myfile.txt와 모두 사용하는 것을 보았습니다 cat < myfile.txt. 이 두 명령 시퀀스 사이에 차이점이 있습니까? 파일의 내용을 쉘에 인쇄하는 것 같습니다.



답변

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

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

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


답변

테스트 케이스에는 눈에 띄는 차이가 없습니다. 가장 확실한 것은 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행동에 큰 차이가 있습니다.


답변

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

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


답변

@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에서 사용하지 않는 리디렉션에도 발생 함). 두 경우 모두 잘못된 종료 코드가 반환됩니다.


답변

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

wc –w food2.txt .

가능한 출력 :

6 food2.txt .

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

wc –w < food2.txt .

가능한 출력 :

6 .

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


답변