RosettaCode 페이지에서 다음 유형의 shebang을 발견했습니다.
--() { :; }; exec db2 -txf "$0"
이는 Db2뿐만 아니라 Postgres에서도 작동합니다. 그러나 나는 전체 라인을 이해하지 못합니다.
이중 대시는 SQL의 주석이라는 것을 알고 있으며 그 후에는 Db2 실행 파일을 호출하고 파일 자체를 일부 매개변수가 있는 파일로 전달합니다. 하지만 괄호, 중괄호, 콜론, 세미콜론은 어떻습니까? 진짜셔뱅 교체방법 #! ?
답변1
관련된:Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?
스크립트에는 shebang/hashbang/ 줄이 없습니다 #!
. 단지 이중 대시가 없기 때문입니다 #!
.
그러나 스크립트는 쉘에 의해 실행되며(위에 링크된 질문과 답변 참조) 해당 쉘에서 -
함수 이름에 유효한 문자가 있으면 해당 행은 --
아무 작업도 수행하지 않는 쉘 함수를 선언합니다(알겠습니다. 실행 :
,아무것도하지 마세요) 호출되지 않습니다.
이 함수는 보다 일반적인 여러 줄 표기법을 사용합니다(좀 더 명확하게 보이도록 하기 위해 이상한 이름이 실제로 함수라는 사실을 가립니다).
-- () {
:
}
함수 정의의 유일한 목적은 유효한 SQL 명령(주석)과 함께 쉘 스크립트에 유효한 행을 포함하는 것입니다. 이런 종류의 코드를 호출합니다.다국어.
가짜 쉘 함수를 선언한 후 스크립트는 쉘 스크립트 인터프리터에 의해 실행될 때 exec
현재 쉘을 실행에 의해 생성된 프로세스로 대체합니다. 이는 명령줄에서 스크립트의 경로 이름을 사용하는 것과 같습니다 db2 -txf "$0"
.db2 -txf
이 트릭은 Python 쉘 , Bourne 쉘 또는 Python을 기반으로 하는 dash
다른 쉘을 사용하는 시스템에서는 안정적으로 작동 하지 않을 수 있습니다 . 이러한 쉘은 이름에 대시가 포함된 함수를 허용하지 않기 때문입니다.ash
yash
ksh88
ksh93
/bin/sh
관련 정보:
다음도 작동할 것이라고 생각합니다(실제로 테스트하지는 않음).
--() { exec db2 -txf "$0"; }; --
답변2
@Kusalananda가 이미 말했듯이 이 트릭은 깨졌으며 모든 쉘에서 작동하지 않습니다.
이식성에 대한 내 생각은 다음과 같습니다.
--/.. 2>/dev/null; exec db2 -txf "$0"
이름이 지정된 파일/디렉토리가 현재 디렉터리에 존재하더라도 첫 번째 명령은 실패 --
하고 모든 오류는 2>/dev/null
;로 닫힙니다. 그런 다음 쉘은 두 번째 명령인 exec
.