나는 라이브러리를 가지고 있습니다. 사용자는 아마도 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
. 이것은 실제로 쉘이 일반적으로 실행을 수행하는 방식입니다.
exec
shebang-less 스크립트를 실행하는 데 사용할 수 있는 다른 일련의 함수가 /bin/sh
있지만 이는 execve
그렇지 않습니다.
쉘에서 파일을 실행하면 정확히 무슨 일이 발생합니까?이 주제에 대한 자세한 내용이 있습니다.