2009-09-16 1 views
0
ls > ls.out 

이렇게하면 목록에 ls.out도 포함됩니다. 필자의 이해 사항은 다음과 같습니다.> (쉘 출력 리다이렉션 연산자는 STDOUT을 취하기 위해 먼저 파일을 생성하고 있지 않다면 ls 커맨드가 재생되고 방금 생성 된 ls.out 파일을 출력에 포함합니다 . 이 맞습니까? 그렇지 않을 경우, 해당 명령의 동작을 자세히 설명해 수 있습니다.존재하지 않는 파일의 쉘 리디렉션을 이해합니다.

마찬가지로

wc temp > temp 

는 방금 만든 임시 파일 내에서 0 0 0 온도를 인쇄 할 수 있습니다.

이 동작 쉘이 흥미 ​​롭습니다. 실제로 작동하는 방법이 궁금합니다. The Unix Programming Environment Book에있는 책. 위의 대답을 언급 한 것처럼 일부 전문가는 내 이해를 바로 잡기를 원합니다.

+0

흥미 롭군요. 놀랍습니다. wc temp> temp 예제는 아직 작성하지 않은 파일을 설명하도록 wc에 요청하고 있습니다. 그 밖의 무엇을 말할 것인가? – pavium

+0

@pavium - 문제는 '온도'가 이미 존재하고 방금 통계를 얻으려고하면 실수로 덮어 쓰게되어 통계가없는 것입니다. –

+0

@pavium :이 두 가지를 시도해보고 차이점을 확인하십시오. 화장실 온도 및 화장실 온도> 두 경우 임시 , 온도는 이미 존재하지 않아야합니다. –

답변

6

표준 출력을 >으로 리디렉션 할 때 셸은 이미 존재하지 않는 파일을 빈 파일로 만듭니다. 또한 해당 파일은 쉘이 분기되고 실행중인 명령을 실행하기 전에 열립니다. wc temp > temp을 수행하면 셸에서 파일을 작성한 다음 열기 및 파일 핸들을 프로세스에서 전달하는 wc을 분기 및 실행합니다.

+0

설명해 주셔서 감사합니다. –

1

매우 단순화 :

ls

가 재 작성한 아이 노드 (디렉토리 엔트리)에서 찾고있다.

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

편집

:

먼저, 두 경우 모두, 리디렉션 (>ls.out 또는 >temp)이 빈 파일을 만듭니다. 디렉토리의 항목 (inode)은 파일의 위치를 ​​가리키고 그것에 관한 정보를 포함합니다. inodes에 대한 Wikipedia 기사를 참조하십시오.

다음, ls의 경우, 단지를 생성 ls.out위한 하나를 포함하는 디렉토리 의 모든 항목이 판독되고 (이 경우 ls.out의 내용이된다) stdout 기록.

또는 wc의 경우, 그것은 계산 (아무것도) 후 비어 temp 그래서 제로 파일 로 계산 기록하는 개행 문자, 단어라는 최근에 생성 된 파일의 바이트 수를 세고 .

파일의 내용 (temp 또는 ls.out)은 모든 읽기가 완료 될 때까지 기록되지 않으므로 포함될 수 없습니다.(ls.out이 존재하지 않는 경우)이 명령을 시도, 무엇 lswc가하고있는 비교하는 더 나은 방법을

:

ls -l > ls.out 

당신은 볼 수는 ls.out의 파일 크기는 제로에있어서이다 (cat ls.out) 안에 들어있는 목록으로 이동하지만, ls -l ls.out을 수행하면 0이 아닌 것을 볼 수 있습니다. 이것은 wc으로보고있는 것에 해당합니다. temp 이미 존재하고 여전히 20 선 위의 명령을 실행 한 후 cat temp의 결과, 그것은 0 온도 될 것이라고이 있다면

+0

몇 가지 추가 설명이 도움이 될 수 있습니다. Dennis. –

+0

설명해 주셔서 감사합니다. –

0

wc -l temp > temp

을 고려하십시오.

나는 쉘이 wc 시도가 제로 도착 temp에서 라인의 납입을 계산하는 경우에 따라서 따라서 기존의 온도를 덮어 쓰기와 존재 비어있는 새 temptemp 경우 만들기 때문에이라고 생각합니다.

실제로 > temp이 쉘에 의해 먼저 실행 된 다음 wc -l temp이 실행됩니다.

관련 문제