scripts 폴더의 인터프리터를 휴대용으로 가리키는 shebang을 만듭니다.

scripts 폴더의 인터프리터를 휴대용으로 가리키는 shebang을 만듭니다.

file.jsnodejs(실제로는 iojs)를 통해 명령줄 셸 스크립트로 실행하려는 JS 파일( )이 있습니다 . Windows에서 MINGW Git Bash를 사용하고 있습니다.

표준 접근 방식은 다음 shebang을 JS 파일에 넣는 것입니다.

#!/usr/bin/env node

그러나 V8 하모니 기능을 활성화하기 위해 명령줄 플래그를 노드에 전달하고 싶습니다. 즉, 다음과 같은 기능을 원합니다.

node --harmony_arrow_functions file.js

다음과 같이 실행될 때

./file.js

플래그를 수동으로 전달할 필요가 없습니다.

사용

#!/usr/bin/env node --harmony_arrow_functions

작동하지 않습니다.

고려한 후https://stackoverflow.com/a/8108970/245966그리고https://stackoverflow.com/a/5735690/245966다음 솔루션을 만들었습니다.

$ ls
file.js nodeharmony.sh

$ cat nodeharmony.sh
#!/bin/sh
exec node --harmony_arrow_functions "$@"

$ cat file.js
#!/bin/sh nodeharmony.sh               # or ./nodeharmony.sh, doesn't matter
console.log("Hello world")

$ ./file.js    # this works fine
Hello world

그러나 문제는 다른 폴더에서 실행할 때 쉘이 다음 nodeharmony.sh대신 현재 작업 디렉토리를 찾으려고 한다는 것입니다 file.js.

$ cd ..
$ ./subfolder/file.js
/bin/sh: ./nodeharmony.sh: No such file or directory

()에서 사용자 정의 통역사를 제공 하지 않고도 모든 폴더에서 실행할 file.js수 있는 휴대용 shebang을 만드는 방법이 있습니까 ?file.jsnodeharmony.shPATH

편집하다:

JS 파일은 유효한 JavaScript 파일로 유지되어야 하므로 첫 #!줄을 초과할 수 없습니다., 즉 내가 file.js다음으로 변경하면

#!/bin/sh
exec $(dirname $0)/nodeharmony.sh "$0"
console.log("Hello world")

그런 다음 쉘은 디렉토리 이름과 매개변수를 올바르게 전달하지만 파일이 유효한 JS 코드가 아니기 때문에 노드 측에서는 실패합니다.

$ ./subfolder/file.js
d:\CODE\subfolder\file.js:2
exec $(dirname $0)/nodeharmony.sh $0
     ^
SyntaxError: Unexpected identifier
    at exports.runInThisContext (vm.js:54:16)
    ...

편집 2:

또한 스크립트를 실행할 가능성도 유지하고 싶습니다.

./file.js

또한

node --harmony_arrow_functions ./file.js

따라서 sed파일 내용을 해킹하고 헤더를 제거한 후 shebang의 노드로 파이프하는 것이 좋습니다. 이 경우 후자의 실행이 불가능하므로 좋지 않습니다.

답변1

편집: (원래 답변은 여전히 ​​명시된 질문에 답변하지만 file.js를 유효한 JS 파일로 만들지 않습니다.) 원하는 동작을 달성하기 위한 다음 단계는 shebang + 1st-line-combination처음 두 줄을 건너뛰고 JS 코드만 사용하여 file.js를 제공하는 것입니다.node

#!/bin/sh
sed '1,2d' $0 |node --harmony_arrow_functions; exit $?
/* Your JS code begins here */

---원래 답변 아래---

인터프리터가 인터프리터 파일과 동일한 디렉토리에 있을 것이라고 확신할 수 있는 경우(설명된 문제임) $(dirname $0).

예:

#!/bin/sh
exec $(dirname $0)/nodeharmony.sh "$0" "$@"

이 경우 실행 시

$ cd ..
$ ./subfolder/file.js

해석 $(dirname $0)되어 exec가 인터프리터 ./subfolder로 사용됩니다 ../subfolder/nodeharmony.sh

답변2

이를 수행하기 위해 유효한 쉘 스크립트이기도 한 Node 스크립트를 생성할 수 있습니다.

#!/bin/sh
//usr/bin/env node --harmony_arrow_functions "$0" "$@"; exit $?

console.log("Hello world")

다른 이름으로 저장하면 file.js어디에서나 실행할 수 있는 스크립트가 생성됩니다. 이는 //동등 에 의존합니다 /. Windows에서는 이것을 테스트하지 않았습니다.

관련 정보