file.js
nodejs(실제로는 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.js
nodeharmony.sh
PATH
편집하다:
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에서는 이것을 테스트하지 않았습니다.