シェルスクリプト: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次の2つの理由で失敗します。

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

おすすめ記事