走りましょう待ってください。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つの理由で失敗します。
- 環境変数にファイルが定義されていないと、
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...