2011-10-20 6 views
13

bash 스크립트는 명령문을 발견 한 후에도 스스로를 삭제할 수 있습니까? 내가 conains test.sh 스크립트 실행 예를 들어 :자체 삭제 bash 스크립트

<--some commands--> 
rm test.sh 
<--some more commands--> 

end 

스크립트 자체

+3

응용 프로그램이 실행되면 해당 코드가 메모리에로드됩니다. 메모리에있는 코드에 영향을주지 않는 디스크의 파일 만 삭제하는 것입니다. –

+1

아마도 전체 스크립트는 실행시 메모리에 읽혀질 것이므로'rm test.sh' 이후의 명령은 실행될 메모리에 여전히 존재합니다. – MrMisterMan

+0

메모리에 복사본을 만들지 않습니다. 예를 들어 스크립트가 실행되는 동안 수정되면 수정 사항이 실행됩니다. 최근 내게 두통이 생겨났다. 귀여운 예 :이 한 줄짜리 스크립트는 'cat $ 0 >> $ 0'과 같은 순서로 디스크를 채 웁니다. – Ned

답변

24

:-) 여러분의 기대에 따라입니다.

그래서 rm은 libc 함수를 "unlink()"라고 부릅니다.이 함수는 "in link"를 inode 디렉토리의 inode 디렉토리에서 제거합니다.이 "링크"는 실제로 파일 이름과 함께 inode 번호입니다 (inode 숫자는 ls -i).

inode는 프로그램이 열려있는 한 존재합니다.

다음과 같이 쉽게 주장을 테스트 할 수 있습니다 : 당신이 더 이상 LS에서 볼 수 있지만 파일이 여전히 열려하지

$ pgrep -lf bash\ ni 
31662 bash ni 
$ lsof -p 31662|grep ni 
bash 31662 wmertens 255r REG 14,2   7 12074052 /Users/wmertens/ni 
$ rm ni 
$ lsof -p 31662|grep ni 
bash 31662 wmertens 255r REG 14,2   7 12074052 /Users/wmertens/ni 

: 다른 창에있는 동안

$ echo read a> ni 
$ bash ni 

. 그래서 bash는 전체 파일을 읽지 않습니다. bash가 끝날 때까지는 실제로 사라지지 않았습니다.

+1

업데이트 프로그램에서 기존 실행 파일을 변경해서는 안되며, 링크를 해제 한 다음 새 버전을 다시 작성해야합니다. – curiousguy

+0

괜찮지 만 다른 프로세스에서 파일을 덮어 쓰면 어떻게됩니까? 파일이 연결 해제되어 "여유 공간"으로 간주됩니다. 그렇지 않습니까? –

+0

@G_G 덮어 쓰기는 파일 이름에 지정된 디렉토리 항목이 이제 다른 inode에 링크된다는 것을 의미합니다. 원래의 inode가 bash에 의해 닫히지 않는 한, 존재할 것이며 bash에 의해 사용될 것입니다. – w00t

-1

사실을 삭제하기 전에 끝날 때까지 실행을,이 현상은 읽기 (bash는 같은) 쉘에 특정 파일을 메모리에 저장 한 다음 실행하십시오.

다음 a.bat 실행하면 : C :>

C a.bat :> 에코 Yo1 이 에코 YO2 다음과 같은 출력을 얻을

a.bat Yo1 델 반향을 Yo1

C :> del a.bat 배치 파일을 찾을 수 없습니다.

이 무엇 실제로 일어나는 일은 그 떠들썩한 파티가 열려있는 파일을 유지하고 rm가 정지하지 것이다

+1

이것은 거짓입니다. w00t의 대답이 맞습니다. 나는 파일이 열려 있고 읽혀지고 있음을 나타내는 bash 스크립트가 실행 중일 때 * 편집 된 * 때 개인적으로 오류 결과를 보았습니다. –