다음 스크립트는 왜 자체를 삭제합니까?


84

다음과 같은 내용으로 실행 파일을 작성하고 실행하면 자체적으로 삭제됩니다.
어떻게 작동합니까?

#!/bin/rm


@DigitalTrauma Heh, 이것이 처음봤을 때의 생각이었습니다.
고양이

에 관한 것이 아닙니다 . rm에 관한 것 #!입니다. 이 질문은 실행 가능한 스크립트가 #!작동 하는 방식 으로 표현할 수 있습니다 .
njzk2

1
이 문제에 어떻게 대처 했습니까?
user1717828

1
그것은 확실히 서사적 인 질문입니다. 한 번만 투표 할 수있어서 유감입니다.
Danila Kiver

답변:


112

커널은 줄로 시작하는 줄을 해석하고 #!이를 사용하여 스크립트 이름을 전달하여 스크립트를 실행합니다. 그래서 이것은 결국 실행됩니다

/bin/rm scriptname

스크립트가 삭제됩니다. 로 ( 스테판 Chazelas가이 지적 , scriptname그렇지 않으면 어떤 경로에서 발견 된, 즉있는 그대로 전달, 당신은 상대 또는 절대 경로를 지정한 경우 - 여기에 스크립트를 찾기 위해 충분 PATH당신이 경우 가능성이 emptry 문자열을 포함 앞에 추가되는 PATH것을 포함하고 스크립트가 현재 디렉토리에 있습니다. echo 스크립트를 사용하여 재생 — #!/bin/echo— 이것이 어떻게 작동하는지 확인할 수 있습니다.)

으로 홉스는 지적이 스크립트가 실제로 의미 rm스크립트가 아닌 bash후자로 시작하는 것입니다 - 스크립트 #!/bin/bash.

Linux에서의 작동 방식에 대한 자세한 내용은 프로그램 실행 방법을 참조하십시오 . 이 기사의 주석은 다른 플랫폼에 대한 세부 사항을 제공합니다. #!shebang이라고하며, 해당 용어를 검색하여 많은 정보를 찾을 수 있습니다 ( 제안 해 준 Aaron 에게 감사합니다 ). 으로 JLP는 지적, 당신은 또한 "파운드 강타"또는 "해시 뱅"(같은 언급 찾을 수 있습니다 #사용하지 않는 국가에서 - 일반적으로 "파운드"로 알려져있다 £- 또는 "해시"및 !"쾅"으로 ). Wikipedia 에 더 많은 정보가 있습니다.


9
"#!"에 대한 다른 이름 당신은 "파운드 뱅"과 "해시 뱅"을들을 수 있습니다. 자세한 내용은 en.wikipedia.org/wiki/Shebang_(Unix) 를 참조하십시오.
jlp

@jlp 파운드 뱅? 저것은 "당신의 돈을 위해 쾅"인가? Heh ...
고양이


1
기술적으로, 인수 는 스크립트 rm경로 가됩니다. 즉, 프로세스가 수행 한 execve () 시스템 호출에 대한 첫 번째 인수입니다. 이 같은 스크립트를 실행하는 경우 일반적으로 ./scriptname될 것입니다, ./scriptname당신이 그것을 호출하는 경우 scriptname, 즉 것 /path/to/scriptname/path/to의 항목입니다 $PATH해당 스크립트가 발견 된 곳은. 일반적으로 scriptname빈 문자열이 $PATH있고 현재 디렉토리에서 scriptname와 같이 스크립트를 호출 한 경우 에만 수행됩니다 scriptname.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.