2010-08-11 6 views
6

프로세스가 특정 파일을 영원히 열어 둘 수 있도록하는 방법이 필요합니다. 여기에 지금까지 무엇을의 예bash 스크립트 내에서 파일을 영원히 열어 두십시오.

sleep 1000 > myfile &

그것은 천 초 동안 작동하지만, 정말 어떤 복잡한 절전/루프 문을 만들고 싶어하지 않습니다. This postcat이 무한대의 경우 sleep과 같은 것을 제안했습니다. 그것은 거의 실수처럼되지 않습니다 보인다

cat > myfile &

: 그래서이 시도? 명령 줄에서 작동하는 것처럼 보였지만 스크립트에서 파일 연결이 열려 있지 않았습니다. 다른 아이디어?

+0

하지? 폴더를 삭제하지 않기 위해서입니까? –

답변

5

cat>myfile&이 작동하는 이유는 표준 입력을 파일로 재 지정하기 때문입니다.

앰퍼샌드 (백그라운드에서)를 사용하여 실행하면 파일 끝을 포함하여 어떠한 입력도받지 않으므로 출력 파일에 아무 것도 인쇄하지 않고 영원히 기다릴 수 있습니다. 당신은 백그라운드 프로세스를 사용하는 것보다 오히려

tail -f /dev/null > myfile & 
+0

그랬습니다! 나는 아직도'cat'이 왜 터미널에서 작동하지만 스크립트에서는 작동하지 않는지 이해하지 못합니다. 터미널에서 나는 "Stopped"에 대한 알림을받으며 스크립트는 내게 이것을주지 않습니다. 그 이유의 일부 여야합니다. – User1

+0

@ User1 - 나는 왜 고양이가 작동하지 않았는 지 추측 할 수 있지만 솔직히 말해서 나는 100 %를 확실히 모른다. 별난 SDTIN과 tty 상호 작용의 일종. 당신이 정말로 관심이 있다면 별도의 질문으로 물어보십시오. 누군가가 확신을 가지고 확신 할 수있을 것이며, 호기심이 생길 것입니다. mysefl을 조사 할 시간이 없습니다. – DVK

0
tail -f myfile 

이것은 파일을 '따라 다니며'파일에 대한 변경 사항을 출력합니다. 당신이 tail의 출력을 표시하지 않으려면, /dev/null 또는 무언가에 출력을 리디렉션 :

tail -f myfile > /dev/null 

당신은 당신의 특정한 경우에 따라 --retry 옵션을 사용할 수 있습니다. 자세한 내용은 man tail을 참조하십시오.

+0

이것은 그가 원하는 것을하지 않을 것입니다. 이것은 파일을 쓰기 위해 열어 두었습니다. 그것은 단지 그것으로부터 읽을 것입니다. – DVK

+0

@DVK, 그는 '글을 쓰는 것이 아니라' '파일을 열어 두십시오'라고 말했습니다. – strager

+0

아니요. 그러나 '> myfile'은 글쓰기를 의미한다는 것을 의미합니다. –

12

:

당신은 표준 입력에 대한 의존성없이 제외하고, 동등한 효과를 얻을 수있는이 명령을, (후자는 스크립트에서 작동하지 만드는 것입니다) 또한 단지 그 파일 기술자 중 하나를 열 수 떠들썩한 파티를 사용할 수 있습니다

exec 5>myfile 

(여기에 현재 파일 기술자 리디렉션을 변경 허용 exec의 특별한 사용 - 자세한 내용은 man bash 참조). 이렇게하면 파일 설명자 5가 "myfile"에 열립니다 (파일을 비우지 않으려면 >>을 사용하십시오).

당신은 나중에 다시 파일을 닫을 수 있습니다

:

exec 5>&- 

(이 중 한 가지 단점은 FD는 그 동안 쉘이 실행 대부분이 무해 모든 프로그램에 의해 상속됩니다 있다는 것입니다 - 예를 들어, 당신. grep들과 sed의는 일반적으로 별도의 FD를 무시합니다 -하지만 (그들은 다음 열어 FD를 유지하기 때문에) 당신이 주변에있어 모든 프로세스를 생성 특히, 일부의 경우 성가신 될 수

+0

이것은 훌륭하고 정말 과소 평가 된 기능입니다 - 감사합니다! –

+1

정말 환상적입니다. 'exec 3 >>/home/me/myfile'을 실행 한 다음 여러 파일의 출력을 fd 3 (예 :'grep thing file >> 3')로 리다이렉하고 경로를 입력하지 않고도 같은 파일에 많은 것을 추가 할 수 있습니다 매번. 끝나면 파일을 닫을 수 있습니다. 나는 그것을 좋아한다. 고마워. – vastlysuperiorman

+1

@vastlysuperiorman : 천만에! 나는 당신의 grep이'grep thing file> & 3'이되고 싶어 할 것이라고 생각하지만, 네, 생각은 소리입니다 :) – psmears

1

cat > myfile & 문제에 실행. in terminal : 스크립트의 일부로 실행되지 않는 경우 : 비대화 형 배경이 command &stdin/dev/null에서 암시 적으로 리디렉션됩니다.

스크립트에서 cat > myfile &은 실제로 cat </dev/null > myfile으로 변환되어 즉시 cat으로 끝납니다.

셸 명령 언어 & Asynchronous Lists에 POSIX 표준을 참조하십시오

영원히 열려있는,하지만 아무것도하지 않고 파일을 유지해야하는 이유 확신
The standard input for an asynchronous list, before any explicit redirections are 
performed, shall be considered to be assigned to a file that has the same 
properties as /dev/null. If it is an interactive shell, this need not happen. 
In all cases, explicit redirection of standard input shall override this activity. 

# some tests 
sh -c 'sleep 10 & lsof -p ${!}' 
sh -c 'sleep 10 0<&0 & lsof -p ${!}' 
sh -ic 'sleep 10 & lsof -p ${!}' 


# in a script 
- cat > myfile & 
+ cat 0<&0 > myfile & 
관련 문제