私は新しい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-for
sh
sh: /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
。