shebang 외에 다른 것이 통역사를 설정할 수 있습니까?

shebang 외에 다른 것이 통역사를 설정할 수 있습니까?

다른 스크립트(rvm)를 소스로 사용하려고 하는 스크립트(tmuxinator에서)를 실행 중입니다. rvm은 sh로부터의 소싱을 명시적으로 허용하지 않습니다. 나는 그것이 문제가 될 것이라고 생각하지 않았습니다. 왜냐하면 tmuxinator 스크립트의 shebang은 다음과 같습니다.

#!/bin/bash

하지만 rvm 사람들이 제안한 코드를 스크립트에서 소스 rvm에 삽입하면,

if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  source "$HOME/.rvm/scripts/rvm"
fi

-나는 얻다

sh: 6: [[: not found

왜 sh가 그곳에서 통역사로 사용되고 있나요? 나는 또한 #!/usr/bin/zsh(스크립트를 호출한 대화형 셸의 $SHELL 값)와 #!/usr/bin/env zsh를 사용했지만 동일한 불만 사항을 표시합니다.

답변1

RVM은 /bin/sh 컨텍스트에서 작동합니까? 이것이 바로 이러한 어려움에 직면한 이유일 것입니다. 소스 스크립트는 상위 인터프리터를 상속받습니다. 보다:http://ss64.com/bash/source.html

. (소스 또는 도트 연산자)

파일 이름 인수에서 명령을 읽고 실행합니다.현재 쉘 컨텍스트.

(강조는 내 것)

답변2

문제는 스크립트가 Ruby에서 호출된 것 같습니다.

exec(script)

그리고 exec는 호출된 스크립트의 shebang 라인에도 불구하고 항상 /bin/sh의 컨텍스트에서 작동합니다.

다음으로 변경

exec('/bin/bash', '-c', script)

공장.

관련 정보