맨위로가기

Cat (유닉스)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

`cat`은 유닉스 계열 운영체제에서 사용되는 명령어 유틸리티로, 파일의 내용을 표준 출력으로 표시하거나 여러 파일을 연결하는 기능을 수행한다. 단일 파일 인수를 받으면 해당 파일의 내용을 터미널에 출력하고, 둘 이상의 파일 인수를 받으면 여러 파일을 연결하여 출력한다. `-u` 옵션을 통해 unbuffered output을 지원하며, 파일 이름 대신 `-`를 사용하면 표준 입력을 읽어들인다. `cat`은 텍스트 파일과 특정 형식의 바이너리 파일에 사용 가능하며, 다양한 옵션을 통해 출력 형식을 제어할 수 있다. `cat`은 유닉스 초창기부터 존재해 왔으며, UUOC(Useless Use of cat)와 같은 용어로 비판받기도 하지만, 여전히 널리 사용되는 유틸리티이다. `zcat`은 압축된 파일의 내용을 출력하는 유틸리티이며, `tac`은 `cat`의 역순으로 파일을 출력하는 유틸리티이다.

더 읽어볼만한 페이지

  • 유닉스 텍스트 처리 유틸리티 - Tr (유닉스)
    `tr` (유닉스)는 텍스트 변환을 위한 유닉스 명령어 유틸리티로, 문자 집합 변환, 특정 문자 삭제 등의 기능을 수행하며, 다양한 옵션과 문자 집합 지정 방식을 지원하여 셸 스크립트 등에서 활용되고, 과거 정치적 악용 사례도 존재합니다.
  • 유닉스 텍스트 처리 유틸리티 - Apropos
    apropos는 사용자가 입력한 키워드와 관련된 매뉴얼 페이지를 검색하는 명령어로, man -k의 래퍼로 작동하며 대소문자를 구분하지 않고 매뉴얼 페이지의 이름 섹션에서 키워드를 검색하여 관련 페이지 목록을 반환한다.
  • 표준 유닉스 프로그램 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 표준 유닉스 프로그램 - Rm (유닉스)
    유닉스 명령어 `rm`은 파일을 삭제하는 데 사용되며, 옵션을 통해 삭제 동작을 제어하고 디렉터리를 재귀적으로 삭제할 수 있지만, 잘못 사용하면 시스템에 심각한 손상을 초래할 수 있어 주의가 필요하며 안전 장치나 휴지통 기능 등의 대안이 존재한다.
  • 유닉스 SUS2008 유틸리티 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 유닉스 SUS2008 유틸리티 - 로케일
    로케일은 소프트웨어 국제화 및 지역화에서 사용자 문화적 배경에 맞춰 사용 환경을 조정하는 설정으로, 표시 언어, 숫자/날짜 형식, 문자 분류, 통화 형식 등을 포함한다.
Cat (유닉스) - [IT 관련 정보]에 관한 문서
기본 정보
종류유닉스 명령어
개발자켄 톰슨, 데니스 리치
발표일1971년 11월 3일
최신 버전(정보 없음)
운영 체제유닉스, 유닉스 계열, 플랜 9, 인페르노 (운영 체제), 리액트OS
플랫폼크로스 플랫폼
장르명령어
라이선스GPLv3+ (coreutils)
GPLv2+ (ReactOS)
웹사이트(정보 없음)
상세 정보
용도파일 연결 및 출력
유래concatenate (연결하다)

2. 규격

단일 유닉스 규격(Single UNIX Specification, SUS)은 `''cat''` 명령어가 인수로 주어진 파일들을 명시된 순서대로 읽고, 그 내용을 동일한 순서로 표준 출력에 쓰도록 규정한다.[8][10] 각 바이트는 읽힌 순서 그대로 출력된다. SUS는 또한 버퍼링되지 않은(unbuffered) 출력을 위한 `-u` 옵션 지원을 의무화하는데, 이는 각 바이트를 읽은 직후 바로 출력하는 것을 의미한다. 그러나 GNU Core Utilities 등 일부 시스템에서는 기본적으로 버퍼링 없이 동작하므로 이 옵션이 무시될 수 있다.[10]

입력 파일 이름으로 단일 하이픈(`-`)이 주어지면, `''cat''`은 해당 순서에서 표준 입력으로부터 데이터를 읽는다. 만약 파일 이름이 전혀 지정되지 않으면, 표준 입력만 읽는다.

`''cat''` 유틸리티는 주로 두 가지 목적, 즉 파일 내용 인쇄와 여러 파일 연결(concatenation)을 수행한다.[8]


  • 파일 인수가 하나일 경우, 해당 파일 내용을 사용자 터미널 에뮬레이터(과거에는 컴퓨터 터미널이나 텔레타이프) 화면에 출력하는 데 가장 흔하게 사용된다. 이는 파일 연결 기능의 특수한 경우이지만, 가장 일반적인 사용법이다.[9]
  • 파일 인수가 둘 이상일 경우, 주어진 순서대로 파일들을 연결하여 하나의 데이터 스트림으로 만든다. 이 결과는 기본적으로 터미널 화면에 출력되지만, 사용자는 종종 리디렉션(`>`)을 사용하여 결과를 새로운 파일에 저장하기도 한다.[8]


명령 구문은 다음과 같다.

`cat [옵션] [파일_이름]`

3. 사용법

`cat` 유틸리티는 파일을 연결(concatenate)하고 내용을 출력(print)하는 두 가지 주요 기능을 수행한다.[8] 가장 일반적인 사용법은 단일 파일을 터미널 에뮬레이터(과거에는 컴퓨터 터미널 또는 텔레타이프) 화면에 출력하는 것이지만,[9] 여러 파일을 인수로 받으면 해당 파일들을 순서대로 연결하여 그 결과를 표준 출력으로 보낸다.[8] 사용자는 종종 이 출력 결과를 리디렉션하여 다른 파일에 저장하기도 한다.[8]

단일 유닉스 명세는 `cat`의 동작을 다음과 같이 정의한다: 인수로 주어진 파일을 순서대로 읽고, 그 내용을 동일한 순서로 표준 출력에 쓴다. 만약 파일 이름 목록에 단일 하이픈(`-`)이 포함되어 있으면, `cat`은 해당 지점에서 표준 입력으로부터 데이터를 읽어들인다. 파일 이름이 전혀 주어지지 않은 경우에도 `cat`은 표준 입력에서만 읽는다. 이 명세는 버퍼링되지 않은 출력을 위한 `-u` 옵션 지원을 요구하지만, 모든 시스템에서 동일하게 동작하지는 않는다.[10]

기본적인 명령어 구문은 다음과 같다.

`cat [옵션] [파일_이름...]`

여러 개의 파일을 하나로 합치는 명령의 예시는 다음과 같다.

`cat xaa xab xac > 합쳐진_파일이름`

셸의 패턴 매칭 기능을 이용하여 다음과 같이 사용할 수도 있다.

`cat xa[a-c] > 합쳐진_파일이름`

3. 1. 옵션

`cat` 명령어는 다양한 옵션을 통해 출력 형식을 제어할 수 있다. OpenBSD 등 BSD 계열 운영체제 버전과 GNU coreutils 버전에서 제공하는 주요 옵션은 다음과 같다.[11]

옵션 (BSD / GNU)GNU 긴 옵션설명
-b--number-nonblank공백이 아닌 행 앞에만 행 번호를 붙여 출력한다.
-n--number모든 행 앞에 행 번호를 붙여 출력한다.
-s--squeeze-blank연속되는 두 줄 이상의 빈 줄을 한 줄의 빈 줄로 압축하여 출력한다.
-v--show-nonprinting탭 문자와 줄 바꿈 문자를 제외한 출력 불가능한 문자(non-printing characters)를 `^` 또는 `M-` 표기법으로 표시하여 출력한다.
-t (BSD) / -T (GNU)해당 없음-v 옵션과 함께 사용되며, 탭 문자를 `^I`로 표시한다. (GNU의 -T-v를 자동으로 포함하지 않는다.)
-e (BSD) / -E (GNU)해당 없음-v 옵션과 함께 사용되며, 각 줄의 끝에 줄 바꿈 문자 대신 ``cat` 명령어는 다양한 옵션을 통해 출력 형식을 제어할 수 있다. OpenBSD 등 BSD 계열 운영체제 버전과 GNU coreutils 버전에서 제공하는 주요 옵션은 다음과 같다.[11]

기호를 표시한다. (GNU의 -E-v를 자동으로 포함하지 않는다.)


  • -u: 표준 출력(stdout)을 버퍼링하지 않고 즉시 출력한다. POSIX 표준에서는 이 옵션이 없을 때의 동작(버퍼링 여부)을 명확히 규정하지 않는다.

3. 2. 예시

명령명령 설명
cat file1file1의 내용을 표시함.
cat file1 file2file1과 file2의 내용을 연결하여 터미널에 그 결과를 표시함.
cat file1 file2 > file3file1과 file2의 내용을 연결하여 파일 file3에 그 결과를 출력함. file3이 이미 존재하면 덮어씀.
cat > newfile신규 파일 newfile을 생성하거나 기존 파일을 덮어쓰고, 표준 입력으로부터 내용을 받아 파일에 저장함. 입력 종료는 Ctrl+D 키 조합을 사용함.
cat -n file1 file2 > file3file1과 file2의 내용을 연결하여, 파일 file3에 그 결과를 행 번호와 함께 출력함. (-n 옵션은 일부 구현에서 지원됨)
cat file1 > file2file1의 내용을 file2에 복사함. file2의 기존 내용은 사라짐.
cat file1 >> file2file1의 내용을 file2의 끝에 추가함. file2가 없으면 새로 생성함.
cat file1 file2 file3>sort > test4file1, file2, file3의 내용을 연결하고, 연결된 전체 내용을 sort 명령어로 정렬하여 그 결과를 test4 파일에 저장함.
cat file1 file2>lessfile1과 file2의 내용을 연결하여 less 명령어를 통해 페이지 단위로 내용을 보여줌.
cat file1>grep examplefile1의 내용 중에서 "example"이라는 문자열을 포함하는 줄만 grep 명령어로 찾아 출력함.


4. 역사

'cat'는 유닉스 초기 버전, 예를 들어 Version 1에 포함되었으며, 단일 파일을 화면으로 복사하는 PDP-7 및 Multics 유틸리티인 'pr'을 대체했다.[3] 이는 켄 톰슨과 데니스 리치가 작성했다.

GNU coreutils에 포함된 'cat' 버전은 토르비욘 그란룬드와 리처드 스톨만이 작성했다.[4] ReactOS 버전은 데이비드 웰치, 세묜 노비코프, 에르메스 벨루스카가 작성했다.[5]

시간이 지남에 따라 'tac' 및 'bat'와 같은 대체 유틸리티도 사용할 수 있게 되었으며, 새로운 기능을 제공했다.[6][7]

5. 유닉스 문화

`cat` 명령어는 유닉스 초기 버전인 Version 1부터 포함된 기본적인 유틸리티로, 단일 파일을 화면으로 복사하는 PDP-7 및 Multics의 `pr` 유틸리티를 대체하기 위해 만들어졌다.[3] 초기 `cat` 명령어는 켄 톰슨과 데니스 리치가 작성했다.

현재 널리 사용되는 GNU coreutils에 포함된 `cat` 버전은 토르비욘 그란룬드(Torbjörn Granlund)와 리처드 스톨만이 작성했으며,[4] ReactOS 버전은 데이비드 웰치(David Welch), 세묜 노비코프(Semyon Novikov), 에르메스 벨루스카(Hermes Belusca)가 작성했다.[5]

시간이 지나면서 `cat`의 기능을 보완하거나 다른 방식으로 파일 내용을 처리하는 `tac`(파일 내용을 역순으로 출력)이나 `bat`(구문 강조, Git 통합 등 추가 기능 제공)과 같은 대체 유틸리티들도 개발되었다.[6][7]

`cat` 명령어는 그 단순함과 강력함으로 인해 유닉스 철학의 중요한 예시로 여겨지기도 하지만, 동시에 그 이름의 모호함과 오용 가능성 때문에 사용자 인터페이스 디자인에 대한 논쟁의 대상이 되기도 한다. 이러한 평가는 유닉스 사용자 문화 속에서 `cat` 명령어가 가지는 독특한 위치를 보여준다.

5. 1. Jargon File 정의

Jargon File 4.4.7판은 ''cat'' 명령어를 다음과 같이 정의한다.

  • 파일 전체 내용을 화면이나 다른 출력 대상으로 멈춤 없이 쏟아내는 것 (''blast''와 동의어).
  • 확장된 의미로는, 많은 양의 데이터를 준비되지 않은 대상에게 보내거나 주의 깊게 살펴보려는 의도 없이 보내는 행위를 의미한다. 이러한 사용법은 어리석은 것으로 간주되며, 유닉스 환경 외부에서는 드물게 사용된다. 관련 명령어로 dd와 BLT가 있다.


유닉스 사용자들 사이에서는 ''cat(1)''의 사용자 인터페이스 디자인에 대해 상반된 평가가 존재한다.

  • 지지자들은 ''cat(1)''이 파일 사이에 불필요한 공백이나 헤더 정보를 추가하지 않고 내용 그대로를 전달하며, 텍스트 파일뿐만 아니라 모든 종류의 데이터를 처리할 수 있다는 점에서 훌륭한 사용자 인터페이스 디자인의 예시로 본다.
  • 반면 비판자들은 ''cat(1)''이라는 이름이 명령어의 주된 사용 방식과 맞지 않아 이해하기 어렵고 나쁜 사용자 인터페이스 디자인의 대표적인 예라고 지적한다. ''cat''은 본래 'concatenate'(연결하다)의 줄임말이지만, 실제로는 두 개 이상의 파일을 연결하기보다 단일 파일을 표준 출력으로 보내는 데 훨씬 더 자주 사용된다. 이러한 이름의 불일치는 마치 LISP의 ''cdr'' 함수 이름만큼이나 직관적이지 않다고 비판받는다.

5. 2. UUOC (Useless Use of cat)

UUOC[15]는 "Useless Use of '''c'''at", 즉 "쓸데없는 cat 사용"의 약자이다. 유즈넷comp.unix.shell 뉴스그룹에서 유래한 관찰에 따르면,[12]

cat의 목적은 파일들을 연결(혹은 'catenate')하는 것이다. 만약 오직 하나의 파일만이 있다면, 그 파일을 아무것과도 연결시키지 않는다면 이는 시간 낭비이고 프로세스를 낭비하는 일이다.[15]

즉, cat 명령어는 본래 여러 파일을 하나로 합치거나 파일 내용을 화면에 출력하는 기능을 수행하지만,[8] 단일 파일을 다른 명령어의 입력으로 넘겨주기 위해 사용하는 것은 비효율적이라는 의미이다. 이러한 사용법은 "cat 남용(cat abuse)"[13]이라고도 불린다.

가장 흔한 UUOC의 예시는 다음과 같다.[12]



cat filename | command arg1 arg2 argn



이 방식은 cat 프로세스를 불필요하게 실행시킨다. 대신 입력 리다이렉션을 사용하는 것이 더 효율적이다.[15]



< filename command arg1 arg2 argn



또는, 더 일반적인 방식은 다음과 같다.[15]



command arg1 arg2 argn < filename



입력 리다이렉션을 사용하면 command가 파일 내용을 표준 입력으로 직접 받게 되므로 cat 프로세스를 생성하는 비용이 들지 않는다. 또한, 리다이렉션 방식은 command가 파일에 대해 임의 접근을 수행할 수 있게 해주지만, cat을 사용한 파이프 방식은 단순히 바이트 스트림으로만 데이터를 전달한다.[12]

다른 UUOC의 예시는 다음과 같다. 많은 명령어는 파일 이름을 인수로 받아 직접 파일을 읽을 수 있으므로, 이런 경우에는 cat을 사용할 필요가 없다.[12]

  • cat file | grep pattern 대신 grep pattern file
  • cat file | less 대신 less file


하지만 UUOC 형태가 선호되는 경우도 있다. 파이프(|)를 사용하여 왼쪽에서 오른쪽으로 데이터 흐름을 표현하는 것이 더 읽기 쉽다고 느끼는 사용자들이 있다.[14] 또한, 입력 리다이렉션 기호(<)를 출력 리다이렉션 기호(>)로 잘못 입력하면 파일 내용이 덮어씌워져 데이터가 유실될(클로버링) 위험이 있다. cat을 사용하면 이러한 실수를 방지하는 데 도움이 될 수 있다.[14] 예를 들어,



command < in | command2 > out



위 명령에서 <>로 잘못 쓰면 'in' 파일의 내용이 사라질 수 있다. 반면 아래 방식은 상대적으로 안전하다.



cat in | command | command2 > out



1995년부터 UUOC 사용에 대한 상이 비정기적으로 수여되었으며, 주로 전문가인 Randal L. Schwartz가 수여했다.[15] 영국인 해커들 사이에서는 UUOC 코드를 수정하는 행위를 고양이(cat)를 뜻하는 속어 'moggy'에서 파생된 demoggification이라고 부르기도 한다.[15]

6. zcat

zcat은 cat과 비슷한 유닉스 프로그램으로, 개별 파일들의 압축 상태를 풀고 그것들을 표준 출력에 연결시킨다. 일반적으로 zcat은 compress로 압축된 파일들에서 작동되었으나, 오늘날에는 gzip이나 bzip2 아카이브들에서도 작동될 수 있다. 이러한 시스템들에서는 gunzip -c와 동일하다.[16]

7. 기타 유틸리티

시간이 지남에 따라 tacbat와 같은 대체 유틸리티도 사용할 수 있게 되었으며, 새로운 기능을 제공했다.[6][7]

참조

[1] 웹사이트 In Unix, what do some obscurely named commands stand for? https://kb.iu.edu/d/[...] Indiana University
[2] 서적 The UNIX Programming Environment Addison-Wesley 1984
[3] 간행물 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[4] 문서 cat die.net
[5] 웹사이트 reactos/cat.c at master · reactos/reactos · GitHub https://github.com/r[...] 2021-08-28
[6] 웹사이트 tac(1) - Linux manual page https://man7.org/lin[...]
[7] 웹사이트 sharkdp/bat https://github.com/s[...] 2021-12-02
[8] 간행물 UNIX programmers manual http://www.bitsavers[...] 1971-11-03
[9] 간행물 Program design in the UNIX environment http://harmful.cat-v[...]
[10] 뉴스 GNU Coreutils manual https://www.gnu.org/[...] GNU 2017-03-01
[11] 문서 OpenBSD manual page and the GNU Core Utiltites version of cat
[12] 뉴스 Perl or Sed? https://groups.googl[...] 1994-12-05
[13] 웹사이트 Merriam Webster's Definition of Abuse https://www.merriam-[...] 2021-02-25
[14] 웹사이트 Stanford Computational Journalism Lab http://www.compciv.o[...] stanford.edu 2017-10-08
[15] 문서 유즈넷의 ''comp.unix.shell''에서 나온 말
[16] 웹사이트 zcat manual page in FreeBSD 7.0 http://www.freebsd.o[...] 2014-02-09



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com