기호의 리디렉션은 어떻게 순차적으로 작동합니까?

기호의 리디렉션은 어떻게 순차적으로 작동합니까?

파일 1, 파일 2, 파일 3이 있습니다.


파일 1에는 다음이 포함됩니다.1

파일 2에는 다음이 포함됩니다.2

파일 3에는 다음이 포함됩니다.3

나는 명령을 사용한다

cat file1 > file2 > file3

결과 :

파일 11

file2(아무것도 포함하지 않음)

파일 31


왜 이 노선의 어떤 것이 파괴되겠습니까? 기본적으로 내가 뒤에서 보지 못하는 것은 무엇입니까?

("추가"를 사용하는 보조 메모 >>는 더 이상합니다)

답변1

Bourne/POSIX 스타일 쉘의 리디렉션배쉬와 같은, 대시, ksh 등

나타나는 순서대로 왼쪽에서 오른쪽으로 처리합니다.

> x 열려 있는그리고 잘랐다file , x표준 출력에 쓰기 위한 파일 설명자를 설정합니다. x당신의 명령:

cat file1 > file2 > file3

할 것이다:

  1. 열고 자르기file2
  2. 이 파일 설명자에 쓰도록 표준 출력을 설정합니다.
  3. 열고 자르기file3
  4. 이 파일 설명자에 쓰도록 표준 출력을 설정합니다.
  5. 달리기cat file1

최종 결과는 표준 출력이 file3런타임을 가리킨다는 것입니다 cat. file2둘 다 file3현재 내용을 지우고 file3(의 내용) 출력을 여기에 씁니다.catfile1


출력을 여러 스트림으로 분할하여 별도의 파일에 쓰려는 경우 다음을 수행할 수 있습니다.사용tee:

cat file1 | tee file2 > file3

기타 쉘(특히zsh)는 다르게 동작하며 명령은 예상할 수 있는 결과를 제공하며 둘 file2다 .file3file1


여기서는 이것이 cat필요하지 않으며 <입력 리디렉션도 작업을 수행합니다.

답변2

fd를 여러 번 리디렉션하면 모든 리디렉션이 수행되고 마지막 리디렉션이 남습니다.

$ strace -f -e open bash -c 'cat file1 > file2 > file3'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
[pid 20508] open("file2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 20508] open("file3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
[pid 20508] open("file1", O_RDONLY)     = 3

따라서 file2열리고 잘린 다음 file3열립니다.

관련 정보