이중 하이픈(--)으로 시작하는 이 셔뱅은 어떻게 작동하나요?

이중 하이픈(--)으로 시작하는 이 셔뱅은 어떻게 작동하나요?

RosettaCode 페이지에서 다음 유형의 shebang을 발견했습니다.

--() { :; }; exec db2 -txf "$0"

이는 Db2뿐만 아니라 Postgres에서도 작동합니다. 그러나 나는 전체 라인을 이해하지 못합니다.

이중 대시는 SQL의 주석이라는 것을 알고 있으며 그 후에는 Db2 실행 파일을 호출하고 파일 자체를 일부 매개변수가 있는 파일로 전달합니다. 하지만 괄호, 중괄호, 콜론, 세미콜론은 어떻습니까? 진짜셔뱅 교체방법 #! ?

https://rosettacode.org/wiki/Multiline_shebang#PostgreSQL

답변1

관련된:Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?

스크립트에는 shebang/hashbang/ 줄이 없습니다 #!. 단지 이중 대시가 없기 때문입니다 #!.

그러나 스크립트는 쉘에 의해 실행되며(위에 링크된 질문과 답변 참조) 해당 쉘에서 -함수 이름에 유효한 문자가 있으면 해당 행은 --아무 작업도 수행하지 않는 쉘 함수를 선언합니다(알겠습니다. 실행 :,아무것도하지 마세요) 호출되지 않습니다.

이 함수는 보다 일반적인 여러 줄 표기법을 사용합니다(좀 더 명확하게 보이도록 하기 위해 이상한 이름이 실제로 함수라는 사실을 가립니다).

-- () {
  :
}

함수 정의의 유일한 목적은 유효한 SQL 명령(주석)과 함께 쉘 스크립트에 유효한 행을 포함하는 것입니다. 이런 종류의 코드를 호출합니다.다국어.

가짜 쉘 함수를 선언한 후 스크립트는 쉘 스크립트 인터프리터에 의해 실행될 때 exec현재 쉘을 실행에 의해 생성된 프로세스로 대체합니다. 이는 명령줄에서 스크립트의 경로 이름을 사용하는 것과 같습니다 db2 -txf "$0".db2 -txf

이 트릭은 Python 쉘 , Bourne 쉘 또는 Python을 기반으로 하는 dash다른 쉘을 사용하는 시스템에서는 안정적으로 작동 하지 않을 수 있습니다 . 이러한 쉘은 이름에 대시가 포함된 함수를 허용하지 않기 때문입니다.ashyashksh88ksh93/bin/sh

관련 정보:


다음도 작동할 것이라고 생각합니다(실제로 테스트하지는 않음).

--() { exec db2 -txf "$0"; }; --

답변2

@Kusalananda가 이미 말했듯이 이 트릭은 깨졌으며 모든 쉘에서 작동하지 않습니다.

이식성에 대한 내 생각은 다음과 같습니다.

--/.. 2>/dev/null; exec db2 -txf "$0"

이름이 지정된 파일/디렉토리가 현재 디렉터리에 존재하더라도 첫 번째 명령은 실패 --하고 모든 오류는 2>/dev/null;로 닫힙니다. 그런 다음 쉘은 두 번째 명령인 exec.

관련 정보