문제

ls > ls.out

여기에는 목록에 ls.out도 포함됩니다.내 이해는 다음과 같습니다> (쉘 출력 리디렉션 연산자는 파일이 아직 존재하지 않는 경우 먼저 파일을 생성하고(STDOUT을 사용하기 위해) ls 명령이 실행되어 출력에 방금 생성된 ls.out 파일을 포함합니다.이 올바른지?그렇지 않다면 해당 명령의 작동 방식을 자세히 설명해 주시겠습니까?

비슷하게

wc temp > temp

방금 생성된 임시 파일 내에 0 0 0 temp를 인쇄합니다.

쉘의 이러한 동작은 흥미롭습니다.실제로 어떻게 작동하는지 궁금합니다.그런데 둘 다 Unix 프로그래밍 환경 책의 연습 문제입니다.위에서 답변드린 것처럼 전문가의 이해를 바로잡아 주시길 바랍니다.

도움이 되었습니까?

해결책

표준 출력을 리디렉션 할 때 >, 쉘은 아직 존재하지 않으면 파일을 빈 파일로 만듭니다. 또한, 해당 파일은 쉘 포크 전에 열리고 실행되는 명령을 실행합니다. 당신이 할 때 wc temp > temp, 쉘은 쓰기를 위해 파일을 열고 포크와 execs wc, 프로세스에서 열린 파일 핸들을 전달합니다.

다른 팁

지나치게 단순화:

ls 리디렉션이 생성한 inode(디렉토리 항목)를 보고 있습니다.

wc 리디렉션이 생성한 inode를 볼 수 있지만 내용을 보면 비어 있기 때문입니다(wc) 아직 작성하지 않았습니다.

편집하다:

첫째, 두 경우 모두 리디렉션(>ls.out 또는 >temp) 빈 파일을 생성합니다.디렉토리의 항목(inode)은 파일의 위치를 ​​가리키고 그에 대한 일부 정보를 포함하도록 만들어집니다.에 대한 Wikipedia 기사를 참조하세요. 아이노드.

다음으로 다음의 경우 ls, 디렉토리의 모든 항목, 에 대한 것을 포함하여 ls.out 방금 생성된 것, 읽기 및 쓰기 stdout (이 경우에는 다음의 내용이 됩니다. ls.out).

또는 다음의 경우 wc, 최근 생성된 파일의 개행, 단어 및 바이트 수를 계산합니다. temp 비어있는 것 그래서 파일에 0 카운트를 씁니다. ~ 후에 그것은 중요합니다 (아무것도 아닙니다).

파일 내용(temp 또는 ls.out)은 모든 읽기가 완료될 때까지 기록되지 않으므로 포함될 수 없습니다.

에 대한 비교하는 더 좋은 방법 무엇 ls 그리고 wc 하고 있는 중이라면 이 명령을 시도해 보십시오( ls.out 존재하지 않습니다):

ls -l > ls.out

다음의 파일 크기를 확인해야 합니다. ls.out 내부에 포함된 목록에 따르면 0입니다(cat ls.out) 하지만 그렇게 한다면 ls -l ls.out 0이 아니라는 것을 알 수 있습니다.이는 당신이 보고 있는 것과 일치합니다. wc.

고려하다 wc -l temp > temp

만약에 temp 이미 존재했고 20 줄은 여전히 cat temp 위의 명령을 실행 한 후에는 0 임시가됩니다.

나는 이것이 껍질이 새 빈을 생성하기 때문에 temp 설사 temp 따라서 기존 온도를 덮어 쓰고있을 때 존재했습니다 wc 선의 무감각을 계산하려고합니다 temp 0이됩니다.

사실상 > temp 먼저 쉘에 의해 실행됩니다 wc -l temp 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top