shebang이 누락되었을 수 있는 파일의 기본 실행 파일 변경

shebang이 누락되었을 수 있는 파일의 기본 실행 파일 변경

나는 라이브러리를 가지고 있습니다. 사용자는 아마도 hashbang을 사용하여 exec어떤 실행 파일을 사용할지 알려주는 실행 파일을 생성할 것입니다. 대부분의 시스템이 기본적으로 설정되어 있는 해시뱅을 생략하면 /bin/sh해당 기본값을 변경하고 싶습니다.

따라서 일부 파일은 다음으로 시작될 수 있습니다.

#!/usr/bin/env foobar

다른 파일은 다음으로 시작할 수 있습니다.

 #!/usr/bin/env perl

또는

 #!/usr/bin/env ruby

어떤 경우에는 사용자가 해시뱅을 완전히 무시합니다. 이 경우에도 파일을 직접 실행하고 foobar기본적으로 실행 파일을 사용하고 싶습니다 .

다시 말해서, 해시뱅이 무엇인지 미리 알 수 없고, 해시뱅이 없으면 기본값이 foobar아닌 기본값이기를 원합니다./bin/sh

제가 하고 있는 작업을 수행하는 방법은 exec먼저 실행할 수 있는 실행 파일을 만들고, 특정 오류 메시지와 함께 실패할 경우 foobar해당 실행 파일을 사용하여 스크립트를 간접적으로 실행하는 것인 것 같아요.

이 같은:

function run {
  stdio=$("$1" 2>&1)
  if [[ stdout/stderr matches a certain error message ]]; then
    foobar $1
  fi
}

내 질문은 - 내가 말하는 것을 아는 사람이 있습니까? 해시뱅이 존재하지 않는 경우 특정 실행 파일을 기본값으로 설정하는 방법을 아는 사람이 있습니까? 해시뱅이 있는지 확인하는 것이 이론적으로 편리하지 않은 것이 아니라, 실행하는 것이 이론적으로 더 편리하다는 것인가요?

답변1

다음 두 단계를 사용하여 이를 달성할 수 있습니다 execve. C 라이브러리에 커널에 대상 실행을 요청하고, 실패하면 retry 를 사용하십시오 foobar. 이것은 실제로 쉘이 일반적으로 실행을 수행하는 방식입니다.

execshebang-less 스크립트를 실행하는 데 사용할 수 있는 다른 일련의 함수가 /bin/sh있지만 이는 execve그렇지 않습니다.

쉘에서 파일을 실행하면 정확히 무슨 일이 발생합니까?이 주제에 대한 자세한 내용이 있습니다.

관련 정보