2013-12-16 3 views
1

$cat <text> text 여기서 text은 비어 있지 않은 파일입니다. stdout에 출력이없고 text 파일이 비어있게되었습니다. 나는 cat 명령이 파일 텍스트를 읽고 내용을 같은 파일로 출력 할 것을 기대했다.cat 명령 : 예기치 않은 출력

그러나 내가 시도하면 $cat <text> newtext 작동합니다! newtexttext 사본입니다.

다른 시도, 시도 할 때 $cat <text>>text 여기서 >>은 일반적으로 파일에 추가됩니다. 내 터미널이 무한 루프에 걸려서 파일 text이 반복적으로 추가됩니다. 왜 이런 일이 생길까요? 당신이

echo "something" > file.txt 

일이 제일 먼저 사용하여 파일로 출력을 리디렉션 할 때

+0

특별한 이유가 있습니까? – Thibault

+0

특별한 이유가 없습니다. – Ajax

답변

4

stdin 및 stdout과 같은 파일을 사용할 수 없습니다. 왜? 모든 명령이 동시에 실행되기 때문에 쉘은 명령을 실행하기 전에 경로 재 지정을 준비합니다. 따라서 출력 파일은 실행 전에 비 웁니다.

대신 임시 파일을 사용해야합니다.

해결 방법은 또한 당신의 솔루션이나 수 :

당신이 그것에 대해 먼저 리디렉션을 수행 할있다 쉘을 생각한다면
cat text > newtext && mv newtext text 
2

, 파일 생성 (재) 것입니다. 그것이 존재한다면, 그것은 비게 될 것이고 그것은 여러분이 보는 것과 정확히 같습니다.

당신은 단순히 당신이 무엇을 시도했다 달성하기 위해

cat file.txt 

를 호출하여 파일의 내용을 표시 할 수 있습니다, 당신은

cat file.txt > temp.txt && mv temp.txt file.txt 

할 수도 있지만 나는 이유가 표시되지 않는 이유를 그렇게하기를 원할 것입니다.

1

. 쉘이 실제로 왼쪽에서 오른쪽으로 명령을 실행하면 cat file은 파일 내용을 터미널에 표시하고 쉘은 > file을보고 을 추적해야합니다. 즉, 터미널에서 출력을 지우고 명령을 다시 실행하십시오. stdout 리디렉션 됨. 쉘이 명령을 구문 분석 그렇게 할 때

이 분명히 리디렉션 먼저 수행해야하고 >이 내용을 덮어 쓰기 때문에 파일은 그것이 비어 을 읽기 전에 clobbered 인 이해가되지 않습니다!