bash 스크립트는 명령문을 발견 한 후에도 스스로를 삭제할 수 있습니까? 내가 conains test.sh 스크립트 실행 예를 들어 :자체 삭제 bash 스크립트
<--some commands-->
rm test.sh
<--some more commands-->
end
스크립트 자체
bash 스크립트는 명령문을 발견 한 후에도 스스로를 삭제할 수 있습니까? 내가 conains test.sh 스크립트 실행 예를 들어 :자체 삭제 bash 스크립트
<--some commands-->
rm test.sh
<--some more commands-->
end
스크립트 자체
:-) 여러분의 기대에 따라입니다.
그래서 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가 끝날 때까지는 실제로 사라지지 않았습니다.
업데이트 프로그램에서 기존 실행 파일을 변경해서는 안되며, 링크를 해제 한 다음 새 버전을 다시 작성해야합니다. – curiousguy
괜찮지 만 다른 프로세스에서 파일을 덮어 쓰면 어떻게됩니까? 파일이 연결 해제되어 "여유 공간"으로 간주됩니다. 그렇지 않습니까? –
@G_G 덮어 쓰기는 파일 이름에 지정된 디렉토리 항목이 이제 다른 inode에 링크된다는 것을 의미합니다. 원래의 inode가 bash에 의해 닫히지 않는 한, 존재할 것이며 bash에 의해 사용될 것입니다. – w00t
사실을 삭제하기 전에 끝날 때까지 실행을,이 현상은 읽기 (bash는 같은) 쉘에 특정 파일을 메모리에 저장 한 다음 실행하십시오.
다음 a.bat 실행하면 : C :>
C a.bat :> 에코 Yo1 이 에코 YO2 다음과 같은 출력을 얻을
a.bat Yo1 델 반향을 Yo1
C :> del a.bat 배치 파일을 찾을 수 없습니다.
이 무엇 실제로 일어나는 일은 그 떠들썩한 파티가 열려있는 파일을 유지하고 rm
가 정지하지 것이다
이것은 거짓입니다. w00t의 대답이 맞습니다. 나는 파일이 열려 있고 읽혀지고 있음을 나타내는 bash 스크립트가 실행 중일 때 * 편집 된 * 때 개인적으로 오류 결과를 보았습니다. –
응용 프로그램이 실행되면 해당 코드가 메모리에로드됩니다. 메모리에있는 코드에 영향을주지 않는 디스크의 파일 만 삭제하는 것입니다. –
아마도 전체 스크립트는 실행시 메모리에 읽혀질 것이므로'rm test.sh' 이후의 명령은 실행될 메모리에 여전히 존재합니다. – MrMisterMan
메모리에 복사본을 만들지 않습니다. 예를 들어 스크립트가 실행되는 동안 수정되면 수정 사항이 실행됩니다. 최근 내게 두통이 생겨났다. 귀여운 예 :이 한 줄짜리 스크립트는 'cat $ 0 >> $ 0'과 같은 순서로 디스크를 채 웁니다. – Ned