Node.js 스크립트에 적합한 해시 뱅


95

여러 환경에서 작동하는 node.js 용 스크립트를 만들려고합니다. 특히 저에게는 OS X와 ​​Ubuntu를 앞뒤로 전환하고 있습니다. 전자에서는 Node가로 설치 node되지만 후자의 경우에는 nodejs. 내 스크립트 맨 위에 다음이있을 수 있습니다.

#!/usr/bin/env node

또는

#!/usr/bin/env nodejs

노드가 설치되어있는 한 두 환경 중 하나가 명령을 지정해야하는 대신 스크립트를 실행 파일로 실행하는 것이 좋습니다 ( ./script-name.jsnode script-name.js).

백업 해시 뱅을 지정하는 방법이나 node.js에 대해 두 경우 모두 호환되는 해시 뱅을 지정하는 방법이 있습니까?


스크립트를 호출하는 래퍼 쉘 스크립트를 만들어 노드가 어디에 있고 무엇이라고 부르는지 알아낼 수 있습니다.
Doon dec

4
Unix 사이트의이 답변에 대한 많은 제안 -unix.stackexchange.com/questions/65235/…
sargant

Ubuntu 12.04에서 12.10으로 업그레이드 #!/usr/bin/node#!/usr/bin/nodejs때 변경 한 nodejs 스크립트가 있습니다. 그리고 두 가지를 모두 확인하는 래퍼에서 호출됩니다. #!/usr/bin/env해킹에 대한 토론 은 this question and my answer를 참조하십시오 .
Keith Thompson

1
사용 된 해시 뱅을 표준화하는 것을 목표로하는 "Hashbang Grammar"라는 3 단계에 TC39 제안이 있습니다. github.com/tc39/proposal-hashbang
M. Twarog

답변:


151

스크립트가 Node 개발자를위한 것이라면 절대적으로

#!/usr/bin/env node

Node 만 .NET으로 설치 한 사람들과의 호환성을 위해 노력하지 않아도됩니다 nodejs.

이론적 해석:

  • 멋진 아이들이하는 일이고, 당신도 그렇게하지 않으면 당신은 멋지지 않습니다. jshint , karma , bower 및 심지어 npm 과 같은 주요 노드 프로젝트 #!/usr/bin/env node는 실행 가능한 스크립트의 shebang으로 사용 됩니다.
  • 시원한 아이가 그 일을하고 있기 때문에, 우분투에 노드와 함께 작동 누구든지를 설정 한 /usr/bin/node에 심볼릭 링크로 nodejs. 있다 높은 볼 지시 스택 오버플로 여기에이 일에, 그리고 모든 웹을 통해. nodejs-legacy전체 목적이이 심볼릭 링크를 만드는 것이 목적인 패키지 도있었습니다 . 노드를 사용하는 사람들은 우분투에이 문제를 해결하는 방법을 알고, 그들은 해야 그들이 거의 어느 노드에 기록 된 소프트웨어를 사용하려는 경우.
  • 문제는 우분투 14.04에서 더 이상 존재하지 않는 것 같습니다. 방금 Node를 제거하고을 실행 했으며에 대한 심볼릭 링크로 apt-get install nodejs생성 /usr/bin/node되었습니다 /etc/alternatives/node. 이 문제로 고통받는 사람들은 줄어들고있는 소수 인 것 같습니다.

노드 문맹 사용자를 대상으로하는 경우에도를 사용할 #!/usr/bin/env node수 있습니다. 필요할 경우 수동 심볼릭 링크 생성 또는 nodejs-legacy패키지 설치에 대한 가능한 필요성을 설치 문서에 추가 할 수 있습니다. 사용 가능 nodejs하지 않은 사람 node이 위의 shebang으로 프로그램을 실행하려고하면 다음과 같은 내용이 표시됩니다.

/ usr / bin / env : node : 해당 파일 또는 디렉토리 없음

그리고 인터넷 검색 은 첫 번째 결과와 첫 페이지에서 여러 번 수정을 제공합니다.

nodejs사용 가능하지만 사용할 수 node없는 시스템 (또는 node실제로 아마추어 패킷 라디오 노드 프로그램 이있는 곳 ) 에서 사용자가 소프트웨어를 실행할 수 있도록 진정으로 필사적으로 확인하려는 경우이 "2 줄 셔뱅"을 사용할 수 있습니다. 에서 유닉스 및 리눅스 스택 교환 :

#!/bin/sh
':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@"

console.log('Hello world!');

하지만 Node 세계의 다른 사람이 거의 없을 때 이것을 정말로해야합니까?


2
에 대한 지원하면 nodejs실행 파일이 바람직하고, 당신은 약간 더 예뻐으로 오두막을 사용하여 찾을 수 #!/bin/sh//bin/false || exec "$(command -v nodejs || command -v node)" "$0".
lennartcl

2
참고 Linux에서 노드에 인수를 전달할 수 없습니다 와 같은, --experimental-modules당신이 사용하는 경우, env오두막 라인을. 주변에 해킹이 있지만 추악 합니다.
Dan Dascalescu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.