Linux Alpine 3.11の$ PATHにSHスクリプトが見つかりません。

Linux Alpine 3.11の$ PATHにSHスクリプトが見つかりません。

私は新しいDockerコンテナにAlpine Linux 3.11を使用しています。

$PATH内容には次の基本変数があります。

echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

wait-forスクリプト(で始まるシェルスクリプト#!/bin/sh)を挿入すると/usr/local/bin正常に表示されます。

chmod +x wait-for
mv wait-for /usr/local/bin/wait-for
ls -l /usr/local/bin/wait-for

生産する:

-rwxr-xr-x    1 root     root          1451 May  1 16:09 /usr/local/bin/wait-for

sh /usr/local/bin/wait-for実行に使用するときも実行されます。

しかし、入って/usr/src/走ろうwait-forとしたらsh: wait-for: not found

私が理解しているように、/usr/local/binディレクトリはそのディレクトリにあるので、$PATHすべてのスクリプトをグローバルに呼び出す必要があります。

私は何を間違って理解しましたか?

/usr/src/を使用するとファイルを実行できますが、プレフィックスなしでsh /usr/local/bin/wait-for使用すると実行できません。/usr/local/bin/wait-forshsh: /usr/local/bin/wait-for: not found

出力は/etc/fstab次のとおりです

/dev/cdrom      /media/cdrom    iso9660 noauto,ro 0 0                          
/dev/usbdisk    /media/usb      vfat    noauto,ro 0 0  

答え1

あなたのインタラクティブシェルはdash(インチャックsh)です。シェルがdash言う

sh: /usr/local/bin/wait-for: not found

スクリプトを実行しようとしたときにスクリプトに#!見つからないインタプリタを指すエラー行が含まれている場合。それ発生する入力したコマンドが見つからないときに発生するのとまったく同じエラーなので、問題だと思うのは簡単です$PATH(この場合ではありません)。他のシェルには、より多くの情報を提供するエラーメッセージがあります(bashそして、zsh「間違ったソルバー:そのファイルまたはディレクトリがありません」と表示し、実行したいソルバーが何であるかを知らせます)。

~からファイルはDOSテキストファイルです。、-lineは、DOSテキストファイルの行終端の一部であるキャリッジリターン文字の一般的な表現であるwhereを#!使用してスクリプトを実行するようにシェルに指示します。 Unixシステムでは、キャリッジリターン文字は「通常文字」であり、行終了の一部ではありません。つまり、スクリプトの実行を開始しようとした後、ファイルが存在しないため失敗します。したがって、/bin/sh\r\r/bin/sh\r通訳スクリプト自体ではなく、「見つかりません」です。

スクリプトの実行明らかにインタプリタは常に#!-lineをバイパスするため、これを実行するとエラーは発生しません。ただし、スクリプトの各行の末尾にはまだキャリッジリターンがあるため、スクリプトが誤動作することがあります。

ファイルをUnixテキストファイルに保存するか、を使用して変換するとdos2unix問題が解決します。

答え2

これを探している人にとって、私の特定の問題は、私のwait-forスクリプトがWindowsの行末に変換されることです。

この問題は、Unix 行の末尾に再保存すると解決されます。

誰かがWindows行の終わりによってファイルが使用されたときにのみ認識される理由を説明するより良い回答を投稿できる場合は、そうでない場合はsh /usr/local/bin/wait-for受け入れ/usr/local/bin/wait-forますwait-for

関連情報