`cat <> file`은 어떻게 작동합니까?


42

cat < file파일 의 내용 을 stdout에 인쇄합니다 .

cat > fileCtrl+ D가 감지되고 입력 텍스트가 file에 쓰여질 때까지 stdin을 읽습니다 .

cat <> file적어도 내 Bash 버전에서 파일 의 내용을 행복하게 인쇄 하지만 오류없이 파일을 수정하지 않으며 수정 타임 스탬프를 업데이트하지 않습니다.

어떻게 배쉬 표준은 겉으로는 무시 정당화 않습니다 >이되고, 더 중요한 것은,와 - 세 번째 문에 일을 아무것도?

답변:


47

Bash는 읽기-쓰기 파일 디스크립터<> 를 작성 하는 데 사용 합니다 .

리디렉션 연산자

[n]<>word

파일 디스크립터 n에서 읽기 및 쓰기를 위해 또는 n이 지정되지 않은 경우 파일 디스크립터 0에서 파일의 이름이 확장 된 파일을 엽니 다. 파일이 없으면 작성됩니다.

cat <> filefile읽기-쓰기를 열고 설명자 0 (표준 입력)에 바인딩합니다. < file표준 입력에 일반적으로 글을 쓰려고 할 사람은 없지만, 가능하다면 가능할 수 있기 때문에, 현명하게 작성된 프로그램 과 본질적으로 동일 합니다.

간단한 C 프로그램을 write(0, "hello", 6)작성 hello하여 직접 테스트 file하여 표준 입력 을 통해 쓸 수 있습니다.

<>다른 POSIX 호환 쉘 에서도 동일한 효과로 작동 해야 합니다.


1
쓰기 ... stdin? ... 이것에 대한 유효한 사용 사례가 있습니까?
Qix

3
비할 데없이 나는 좋은 것을 생각할 수 없습니다. 명시 적 설명자 ( 4<>file)를 주는 것이 유용하며, 0을 기본값으로 사용하는 것이 좋습니다. stdout에서 읽는 것이 더 좋지 않습니다.
Michael Homer

5
<>Linux와 같은 일부 시스템에서는 다른 프로세스가 쓰기 위해 열 때까지 차단하지 않고 명명 된 파이프를 여는 데 유용합니다.
Stéphane Chazelas

1
@Qix : 잘 작성 (0, "비밀번호 :", 10)은 tty와 같은 것을 물어볼 경우 암호를 묻는 좋은 방법입니다. 나는 stderr에서만 보았지만 특히 같은 기술이 stdin에서 작동하지 않는 이유는 없습니다.
Joshua

3
@Qix- POSIX 이론적 근거 - <>운영자는 여러 터미널에서 작동하는 응용 프로그램을 작성하는 데 유용 할 수 있으며 때로는 쉘을 시작하려고했습니다. 그 쉘은 표준 제어 터미널에서 실행되는 응용 프로그램을 실행할 수 없다면 <>... ... pager와 같은 more명령을 얻기 위해 표준 오류에서 읽은 표준 입력 및 표준 출력 을 사용할 수 없다면 ... 둘 다 일반적인 사용법으로 사용할 수 있습니다. cat food | more - >/dev/tty03 2<>/dev/tty03
mikeserv

38

<> file(기본적 등으로 파일 기술자 0 (표준 입력)에서 파일을 엽니 <에서) 읽기 + 쓰기 모드 의 잘림없이 원본는 사전에 존재하지 않은 경우 파일을 생성 .

이는 시스템 호출에 O_RDWR|O_CREAT전달 된 플래그에 해당합니다 open(). 반대로 <O_RDONLY>O_WRONLY|O_CREAT|O_TRUNC>> O_WRONLY|O_CREAT|O_APPEND.

응용 프로그램이 일반적으로 stdin에 쓰지 않으므로 stdin 쓰기 가능을 갖는 것은 종종 유용하지 않습니다. 응용 프로그램은 일반적으로 읽을 기대하지 않습니다 그리고 그들이 시작할 때받는 파일 기술자에 쓰기; 그들은 보통 stdin (또는 그들이 직접 여는 파일 디스크립터)에서 읽고 stdout 또는 stderr (또는 그들이 열어 둔 파일 디스크립터)에 씁니다.

<> 그것의 용도를 가질 수 있습니다 :

  • 당신은 선호 할 cat <> file이상 cat < file이있는 경우 명령이 실패하지 않으려면 file존재하지 않지만, 빈은 file대신 만들었습니다.
  • 잘리지 않는 부분은 <>파일을 덮어 쓰는 데 유용합니다. 그러나이 경우 일반적으로 파일 디스크립터 0에서 사용하지 않습니다.

    printf xxx 1<> file

    의 첫 3 바이트를 file로 바꿉니다 xxx.

  • Linux와 같은 일부 시스템 <>에서는 명명 된 파이프 (FIFO)에서 차단되지 않고 명명 된 파이프를 열고 (다른 프로세스가 다른 쪽 끝을 열기를 기다리지 않고) 파이프 구조가 활성 상태로 유지되도록합니다. 예를 들어

    mkfifo pipe; sed 's/foo/bar/g' <> pipe

    sed다른 많은 프로세스에서 들어오는 데이터를 처리하고 보지 못합니다 eof.


1
AT & T ksh93에서 <>기본값 1<>0<>(stdin) 대신 (stdout )입니다. 이것은 내가보고 한 POSIX 호환 버그이며 다음 릴리스에서 수정 될 것입니다. github.com/att/ast/issues/75 그러나 현재 ksh93 버전이 사용되지 않을 때까지 <>이식 가능하게 사용하려면 파일 설명자 번호를 포함시켜야합니다 .
Martijn Dekker

@MartijnDekker, 나는 처음에 그것에 대해 당신에게 말한 사람이었다 ;-). ksh93t + (동작이 변경된 위치) 이상에만 해당됩니다.
Stéphane Chazelas

리눅스 와 달리 시스템이 어디에서 mkfifo fifo; exec 3<>fifo차단 되는가?
Billy 삼촌
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.