배쉬 : 스크립트에서 실행 대 소스를 감지합니까?


19

올바른 작동을 위해 쉘에 있어야하는 전역 환경 변수 (LD_LIBRARY_PATH, PATH, ROOTDIR 등)를 설정하는 파일 시스템 (빌드 프로세스의 부작용) 주위에 스크립트가 있습니다. 물론, 그것은 그것이 필요 source script.sh하거나 . script.sh작동하지 않아야 한다는 것을 의미합니다 ./script.sh(새로운 쉘을 생성하고 현재 쉘에서 변수를 설정하지 않음).

누군가가 달리는 것을 막 거나 경고 하기 위해 스크립트에 추가 할 수있는 것이 ./script.sh있습니까?

답변:


15

쉘 스크립트 $0에서 현재 실행중인 스크립트의 이름입니다. 이것을 사용하여 다음과 같이 소스 또는 실행 중인지 알 수 있습니다.

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi

5

가장 간단한 방법 bash은 다음과 같습니다.

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE 항상 스크립트의 이름 / 경로를 포함합니다.

$0 소스가 아닌 경우 스크립트의 이름 / 경로 만 포함합니다.

따라서 일치하면 스크립트가 소스되지 않았 음을 의미합니다.



1

다른 옵션은 실행 권한을 제거하는 것입니다. 이 경우 실행할 수는 없지만 여전히 소스가 될 수 있습니다.


1
이것은 불완전합니다. 스크립트 bash script의 실행 플래그에 관계없이 스크립트를 계속 실행할 수 있습니다 . 또한 Cygwin (이 카운트를 수행합니까?)에서 실행 플래그를 제거 할 수 없습니다.
티노

0

예를 들어 $ 0 ( 미켈 답변) 을 확인하는 것 외에도 확장명을 .sh에서 .src로 변경하는 데 유용 할 수 있습니다. 이 스크립트를 실행해서는 안되는 사람을 이해하는 데 도움이됩니다.


0

커스텀 인터프리터 만들기 source_reminder:

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

실행 가능하게 만드는 것을 잊지 마십시오. 그런 다음 스크립트에서 사용하십시오.

#!/path/to/your/source_reminder
foo
bar
whatever

이제 소싱하지 않고 스크립트를 실행하면 알림이 해당 작업을 수행합니다.


잘 잡았다. #!/bin/echo do not execute또는 #!/bin/false#!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }. 그러나 이것은 스크립트가 sh scriptShebang을 무시하기 때문에 다음과 같이 실행되는 경우를 포착하지 않습니다 .
티노
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.