IO 리디렉션 연산자는 언제 실행되나요?

IO 리디렉션 연산자는 언제 실행되나요?

Linux가 리디렉션 연산자를 처리하는 방법에 대해 약간 혼란스럽습니다.

내 홈 디렉터리에는 파일이 하나만 있습니다.

andy$: ls
demo.mp4

이제 ls출력을 파일로 보내면 demo.mp4해당 파일 외에는 디렉터리에 아무것도 없기 때문에 해당 파일에서만 출력을 볼 수 있습니다.

andy$: ls > myfile

그러나 나는 실제로 myfile포함 자체를 발견했습니다!

andy$ cat myfile
demo.mp4
myfile <-- ???

그러니까 ls처형당한다는 뜻이군요뒤쪽에창조 myfile?

그것은 다음과 같습니다:

  1. 만들다myfile
  2. 디렉터리 내용 나열ls
  3. myfile현재 존재하는 내용을 myfile파일에 씁니다.

따라서 리디렉션하려는 파일을 제외해야 하는 경우 다음을 수행해야 합니다.

ls | grep -v "myfile" > myfile

우선, 내 말이 맞지?

만일이 경우라면,? 이에 대한 자세한 정보는 어디서 찾을 수 있나요?

답변1

그래 네가 맞아.

쉘은 명령을 실행하기 전에 리디렉션을 수행합니다. 쉘이 명령을 실행할 때 필요에 따라 새 명령의 표준 입력, 출력 및 오류를 설정합니다. 기본적으로 터미널(또는 쉘이 연결된 모든 항목)에 연결됩니다. 리다이렉션이 존재하면 해당 파일 디스크립터가 해당 파일(또는 파이프 등)에 연결된다. 버퍼링 등이 없습니다. 따라서 쉘은 프로그램의 출력을 축적하지 않으며그 다음에파일에 기록하고 프로그램의 출력을 파일에 연결하고 모든 것을 처리합니다.

이는 명령을 실행하기 전에 파일을 열어야 함을 의미합니다.

이에 대한 자세한 내용은 다음에서 확인할 수 있습니다.쉘 언어에 관한 POSIX 장. 첫 번째 섹션에는 명령을 실행하기 전에 쉘이 수행하는 일련의 작업이 나열되어 있으며 명령이 실행되기 전에 리디렉션이 발생하는 것을 볼 수 있습니다.

답변2

ls열린 파일을 stdout으로 시작 하므로 ls프로그램이 실행되기 전에 파일을 생성해야 합니다.

더 많은 정보를 원하시면 쉘에 대한 POSIX 표준을 확인해 보세요:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

그리고 쉘 명령 언어에 대한 설명은 다음과 같습니다.http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18

관련 정보