"trap -⁠- EXIT"와 "trap - EXIT"의 차이점

"trap -⁠- EXIT"와 "trap - EXIT"의 차이점

Bash가 로 호출되면 sh예를 들어 트랩을 설정 해제하는 데 사용할 수 없지만 trap -- EXIT로 호출되면 bash사용할 수 있습니다.

trap - EXIT쉘이 어떻게 호출되든 상관없이 작동하는 것 같습니다.


출력 예:

[vagrant@localhost ~]$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar  9  2016 /bin/sh -> bash
[vagrant@localhost ~]$ sh
sh-4.1$ trap 'echo something' EXIT
sh-4.1$ exit
exit
something
[vagrant@localhost ~]$ sh
sh-4.1$ trap 'echo something' EXIT
sh-4.1$ trap -- EXIT
trap: usage: trap [-lp] [[arg] signal_spec ...]
sh-4.1$ trap - EXIT
sh-4.1$ exit
exit
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ exit
exit
something
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ trap -- EXIT
[vagrant@localhost ~]$ exit
exit
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ trap - EXIT
[vagrant@localhost ~]$ exit
exit
[vagrant@localhost ~]$ 

문서를 확인했지만 어디에서도 차이점이 명확하게 나타나지 않았습니다. 나하다표시된 단일 하이픈 형식은 다음과 같습니다.POSIX에 의해 지정됨.

--작동하지 않는 것 외에 함정을 해제하는 두 가지 방법 사이에 동작에 차이가 있나요 sh?

답변1

트랩(1P)에 이에 대한 설명이 있습니다.매뉴얼 페이지그리고 더고급 Bash 스크립팅 가이드, --명령의 "옵션 끝"을 나타내는 데 사용되는 내장 Bash를 설명합니다. using 스크립트는 다른 시스템 간에 이식 가능하도록 설계되었기 때문에 bash는 POSIX 사양과 일치하도록 일부 셸 동작을 변경하는 를 sh사용하여 실행된 것처럼 동작합니다 .--posix

신호가 "잡히면"(예 EXIT: ) 명령 뒤의 첫 번째 인수를 신호에 바인딩하고 eval신호가 방출될 때 이를 -ing하며 정상적인 동작을 무시합니다( 제외 EXIT). 따라서 trap 'echo something' EXIT실행 하면 exit쉘이 eval 'echo something'종료되기 전에 종료됩니다. 이는 또한 다른 신호에서도 작동합니다. 예를 들어 TERM스크립트 등의 우아한 종료 기능에 바인딩될 수 있습니다. trap -- EXIT실행 시 --"인수 끝"으로 해석되어 trap신호가 null( )에 바인딩됨을 나타내며 ''(앞이나 뒤에 플래그가 없기 때문에 --) 쉘에 신호를 무시하도록 지시합니다(그러나 EXIT에는 적용되지 않음). , 그러나 다른 사람에게는 Signal). 그러나 실행은 trap -- 'echo something' EXIT여전히 eval 'echo something'​​중지되고 종료됩니다 exit. 사양에 따르면 trap명령 -자체는 쉘이 지정된 신호에 대한 트랩을 재설정한다는 것을 나타내므로 shBash와 Bash 모두에서 작동합니다.

관련 정보