나는 라이브러리를 가지고 있습니다. 사용자는 실행 파일을 생성해야 하며 잠재적으로 해시뱅을 사용하여 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/sh
execve
쉘에서 파일을 실행하면 정확히 무슨 일이 발생합니까?이 주제에 대해 더 자세히 설명되어 있습니다.