달리기를 해보세요기다려봐.sh+x 실행 권한 없이 스크립트를 작성하려면 bash 명령을 사용하십시오.
bash wait-for-it.sh google.com:80
시간 초과: 'wait-for-it.sh' 명령을 실행할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.
wait-for-it.sh: google.com을 기다린 후 15초 후에 시간 초과가 발생했습니다:80
(오류 메시지, 2번째 줄스크립트 내부, 실행 권한이 부여되어도 위와 동일)
그러나 +x가 주어지고 직접 실행되면 작동합니다.
./wait-for-it.sh google.com:80
wait-for-it.sh: 15초 동안 기다리세요 google.com:80
wait-for-it.sh: google.com:80은 1초 후에 사용할 수 있습니다.
스크립트에 실행 권한을 부여하지 않고 스크립트를 사용하거나 문제를 디버깅할 수 있는 방법이 있나요?
답변1
확인해보면기다려봐.sh스크립트. 다음 기능을 볼 수 있습니다.
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
이 줄을 보면 :
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet ...
이제 실행하면 bash wait-for-it.sh google.com:80
다음 두 가지 이유로 실패합니다.
- 환경변수에 파일이 정의되어 있지 않으면
wait-for-it.sh
파일이 인식되지 않습니다.$PATH
- 파일에
wait-for-it.sh
실행 권한이 없습니다:
+x 실행 권한 없이 wait-for-it.sh 스크립트를 실행해 보세요.
이제 함수를 보면 파일 이름( )이 있는 $0
값 이 함수에 전달되고 있는 것입니다 . 따라서 기본적으로 다음 명령을 사용하여 "직접 실행"합니다(일부 매개변수 사용).$0
wait-for-it.sh
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0
timeout
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT wait-for-it.sh --quiet ...
wait-for-it.sh
해결책은 bash를 실행할 때 절대 또는 상대 경로를 사용하는 것입니다. 또한 파일에 실행 권한을 할당해야 합니다.
#Using relative path:
bash ./wait-for-it.sh google.com:80
#Using absolute path:
bash /path/to/wait-for-it.sh google.com:80
#e.g.
bash /home/user/wait-for-it.sh google.com:80
"bash wait-for-it.sh google.com:80"이 실패하는 이유는 무엇입니까?
wait_for_wrapper
다음과 같이 함수를 편집 할 수 있습니다 .
wait_for_wrapper()
{
echo Running "$0"
echo Whereis "$0": $(whereis "$0")
$0
echo Exit...
exit #to avoid running the following code
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
실행 권한을 사용하여 실행하면 bash wait-for-it.sh google.com:80
다음 오류가 발생합니다.
Running wait-for.sh at /home/user/...
Whereis wait-for.sh: wait-for.sh:
wait-for.sh: line 56: wait-for.sh: command not found
Exit...
이전에 말했듯이 해당 줄이 $0
실행을 시도하고 있지만 env 변수의 어떤 디렉터리에도 wait-for.sh
없습니다 .$PATH
이제 파일 이름을 wait-for.sh
로 변경하겠습니다. ls 명령은 일반적으로 위치하는 디렉터리를 ls
포함하므로 인식됩니다 . $PATH
따라서 실행하면:/usr/bin/
ls
bash ls google.com:80
당신은 얻을 것이다:
Running ls at /home/user/...
Whereis ls ls: /usr/bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz
#This output is of my $HOME directory:
Postman Templates projects
bin go ls
Public Videos Documents
Downloads Pictures temp
Exit...