hashbang이나 다른 곳에서 파일을 실행하는 방법에 대한 추가 지침이 포함되어 있습니다.

hashbang이나 다른 곳에서 파일을 실행하는 방법에 대한 추가 지침이 포함되어 있습니다.

스크립트 상단에 이 내용이 있습니다.

#!/usr/bin/env mocha

대부분의 사람들이 알고 있듯이 이는 스크립트를 실행하는 데 사용할 실행 파일을 운영 체제에 알려줍니다.

그러나 내 질문은 - 스크립트 실행 방법에 대한 추가 정보를 mocha 실행 파일에 어떻게 포함할 수 있는가입니다.

Mocha에는 선택적 매개변수가 필요하므로 다음과 같이 하고 싶습니다.

#!/usr/bin/env mocha --reporter=tap --output=foo

그러나 나는 이것이 허용되지 않는다고 생각한다.

파일 실행 방법에 대한 자세한 정보를 mocha 실행 파일에 제공하려면 어떻게 해야 합니까?

답변1

이것셰르본라인은 커널에 의해 해석되며 그다지 유연하지 않습니다. Linux에서는 단일 인수로 제한됩니다. 구문은 #!, 선택적 공백, 인터프리터 경로(공백 없음), 선택적 공백 및 선택적 단일 인수(시작 부분을 제외하고 공백을 포함할 수 있음)입니다. 또한 총 Shebang 라인 크기는 128바이트로 제한됩니다(BINPRM_BUF_SIZE커널 소스 코드의 상수load_script).

여러 매개변수를 전달하려면 해결 방법이 필요합니다. 경로 확장을 사용하는 경우 #!/usr/bin/env명령 이름을 위한 공백만 있고 다른 매개변수는 없습니다.

가장 확실한 해결책은 스크립트를 래핑하는 것입니다. 모카 코드를 포함하는 대신 /path/to/my-script모카 코드를 다른 파일에 넣고 작은 쉘 스크립트를 /path/to/my-script.real만들 수 있습니다. /path/to/my-script다음은 실제 코드가 스크립트와 동일한 이름을 가진 파일에 있고 .real끝에 추가되어 있다고 가정하는 래퍼 예시입니다.

#!/bin/sh
exec mocha --reporter=tap --output=foo "$0.real" "$@"

셸 래퍼를 사용하면 환경 변수 정의, 사용 가능한 인터프리터 버전 찾기 등과 같은 보다 복잡한 작업을 수행할 수 있는 기회가 제공됩니다.

인터프리터 전에 사용하면 execmocha 스크립트가 셸 래퍼와 동일한 프로세스에서 실행되도록 합니다. 그렇지 않은 경우 exec셸에 따라 하위 프로세스로 실행될 수 있습니다. 이는 예를 들어 스크립트에 신호를 보내려는 경우에 중요합니다.

때로는 래퍼 스크립트와 실제 코드가 동일한 파일에 있을 수 있습니다.다국어— 두 가지 다른 언어로 된 유효한 코드가 포함된 파일입니다. 다중 언어 작성이 항상 쉬운 것은 아니지만(또는 가능한 경우도 있지만) 두 개의 별도 파일을 관리하고 배포할 필요가 없다는 장점이 있습니다. 이것은 쉘 부분이 파일에서 JS 인터프리터를 실행하는 JavaScript/쉘 다국어 프로그램입니다(JS 인터프리터가 shebang 행을 무시한다고 가정하고 그렇지 않은 경우 수행할 수 있는 작업이 없음).

#!/bin/sh
///bin/true; exec mocha --reporter=tap --output=foo "$0" "$@"
… (the rest is the JS code) …

답변2

후속 조치로자일스의 대답, 이는 독립형 래퍼입니다. 그의 두 가지 솔루션이 혼합되어 있습니다. Gilles가 언급한 다중 언어 스크립트(유지 관리 및 배포가 필요한 스크립트)의 장점은 있지만 단점은 없습니다(Gilles의 말을 인용하면 "다언어 스크립트 작성이 항상 쉽거나 가능한 것은 아닙니다").

스크립트 상단에 몇 줄만 추가하면 됩니다.

#!/bin/bash
exec mocha --reporter=tap --output=foo <(sed -n '/^#MOCHA_START#/,$ p' "$0")
#MOCHA_START#
....
....
(mocha script)
....
....

이 줄 다음은 #MOCHA_START#실제 mocha 스크립트이며 변경되지 않습니다. 처음 세 줄은 mocha 스크립트를 추출하고 해당 스크립트와 필수 매개변수를 사용하여 mocha를 호출합니다.

그러나 텍스트 편집기에서 파일을 Mocha 스크립트로 해석하고 그에 따라 색상을 지정해야 할 수도 있습니다. 스크립트의 첫 번째 줄(Bash 스크립트임을 나타냄)로 인해 혼동될 수 있기 때문입니다.

여기에 이미지 설명을 입력하세요.

답변3

Shebang 라인을 사용할 때의 단점 중 하나 #!/usr/bin/env는 매개변수를 전달할 수 없다는 것입니다.

그러나 인터프리터 경로를 사용하는 경우 인수를 전달할 수 있습니다.

#!/path/to/mocha --reporter=tap --output=foo

또한보십시오:

답변4

현재 이 작업을 수행하는 방법을 알고 있는 유일한 방법은 환경 변수를 사용하는 것입니다. 따라서 내 해시뱅에는 다음이 있습니다.

#!/usr/bin/env mocha

...mocha 또는 모든 실행 파일이 허용되어야 합니다.환경 변수, 명령줄 인수 대신 올바르게 작동하도록 합니다.

불행하게도 많은 실행 파일이 환경 변수를 사용하지 않기 때문에 이는 매우 제한적이므로 다른 라이브러리 등을 호출해야 하는 라이브러리에서는 매우 어렵습니다.

관련 정보