잠재적으로 shebang이 누락된 파일의 기본 실행 파일을 변경합니다.

잠재적으로 shebang이 누락된 파일의 기본 실행 파일을 변경합니다.

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

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

#!/usr/bin/env foobar

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

 #!/usr/bin/env perl

또는

 #!/usr/bin/env ruby

그리고 어떤 경우에는 사용자가 해시뱅을 모두 생략하기도 합니다. 이 경우에도 파일을 직접 실행하고 기본적으로 foobar실행 파일을 사용하고 싶습니다.

다시 말해서, 나는 hashbang이 무엇인지 미리 알지 못하며 hashbang이 없으면 foobar기본값 대신 기본값을 원합니다./bin/sh

내가 하고 있는 일을 수행하는 방법은 먼저 실행할 수 있는 실행 파일을 만들고 exec, 특정 오류 메시지와 함께 실패하는 경우 실행 파일을 사용하여 간접적으로 스크립트를 실행하는 것 foobar입니다.

이 같은:

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

내 질문은 - 내가 말하는 내용을 아는 사람이 있습니까? 그리고 hashbang이 없는 경우 특정 실행 파일을 기본값으로 설정하는 방법을 아는 사람이 있습니까? 이론적으로는 해시뱅이 있는지 확인하는 것이 덜 편리하고 이론적으로는 해시뱅을 실행하는 것이 더 편리하다는 것이 아닙니다.

답변1

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

exec사용하여 shebang-less 스크립트를 실행하는 다른 가족 기능이 있지만 그렇지 않습니다./bin/shexecve

쉘에서 파일을 실행하면 정확히 무슨 일이 발생합니까?이 주제에 대해 더 자세히 설명되어 있습니다.

관련 정보