쉘 스크립트: bash 명령으로 실행할 때 해당 파일이나 디렉토리가 없습니다.

쉘 스크립트: bash 명령으로 실행할 때 해당 파일이나 디렉토리가 없습니다.

달리기를 해보세요기다려봐.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다음 두 가지 이유로 실패합니다.

  1. 환경변수에 파일이 정의되어 있지 않으면 wait-for-it.sh파일이 인식되지 않습니다.$PATH
  2. 파일에 wait-for-it.sh실행 권한이 없습니다:

+x 실행 권한 없이 wait-for-it.sh 스크립트를 실행해 보세요.

이제 함수를 보면 파일 이름( )이 있는 $0값 이 함수에 전달되고 있는 것입니다 . 따라서 기본적으로 다음 명령을 사용하여 "직접 실행"합니다(일부 매개변수 사용).$0wait-for-it.sh
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0timeout

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...

관련 정보